wemos d1r1 + nrf

Тема в разделе "ESP8266, ESP32", создана пользователем Flash, 14 апр 2019.

  1. Flash

    Flash Нерд

    Добрый вечер. Пытаюсь подключить нрф к вемосу. Данные отправленные с вемоса ловлю ардуинкой.
    Код (C++):
    #include <SPI.h>                                          
    #include <nRF24L01.h>                                    
    #include <RF24.h>                                        
    RF24           radio(D9, D10);                              
    struct package{
      char axis;
      int action;
      int information;
    };
    package pac;
    void setup(){
        Serial.begin(9600);
        radio.begin();                                      
        radio.setChannel(5);                                
        radio.setDataRate     (RF24_1MBPS);                  
        radio.setPALevel      (RF24_PA_HIGH);              
        radio.openWritingPipe (0x1234567890LL);              
        pac.information = 1;
    }

    void loop(){
        pac.axis = 'x';
        pac.action = 1;
        pac.information++;
        radio.write(&pac, sizeof(pac));                  
    }
    Для теста с каждой следующей посылкой pac.information увеличиваю на 1. Однако принимающая ардуина выводит все время
    Код (Text):
    x 0 256
    Получается, что нормально только pac.axis доходит. Pac.action должен быть 1, а information возрастать с каждой посылкой. Пробовал CE, CSN с D9, D10 менять на D2, D8. Все то же самое. При этом если отправляющий wemos заменить на arduino, все работает как надо.
     
  2. Flash

    Flash Нерд

    Изменил тип данных в структуре на byte, все работает, но мне мало байта
     
  3. Daniil

    Daniil Гуру

    Вы отправляете размер структуры (sizeof),я не знаю что вы отправляете, но надо элементы структуры, обычно то, что у вас написано используют для массивов - у вас не массив
     
  4. Flash

    Flash Нерд

    не совсем понимаю, как будут выглядеть функции write и read. В описании говориться, что надо передать указатель на данные для отправки/получения и количество байт. Или какие-то другие функции использовать?
     
  5. Flash

    Flash Нерд

    И почему если int на byte поменять, все работает?
     
  6. Daniil

    Daniil Гуру

    Если я правильно понимаю, то там говорится о "строке", т.е. массиве.
    Попробуйте написать:
    Вы должны будете получить "х".
    Соответственно так нужно пройтись по всем элементам структуры. НО вопрос что будет передано для action, точнее что получено.
    Для разбирательства в этой проблеме смотрите ascii таблицу. Когда вы передаете байт равный 1, то символ, который вы увидете в терминале...зависит от терминала и его настроек.
     
  7. Daniil

    Daniil Гуру

    Наверняка я не знаю.
    Гипотеза.
    Когда вы объявляете структуру в байтах, то в памяти мк выделяется 3 подряд идущих байта, в каждом из которых хранится нужные вам данные.
    тут вы даете указатель на переменную, который указывает на первый элемент структуры (axis). SizeOf сообщает, что объем данных для отправки = 3 байта. Процедура проходит по памяти и отправляет эти байты, т.о. программе кажется что формально вы ей пихнули массив из 3ех элементов.

    Когда же у вас int"ы, то sizeOf выдает 5, т.к. 2 инта это 4 байта + 1 байт от чара. И так же процедурка передает не думая 5 байт, будто бы это массив - тут моя гипотеза плавает, но не знаю в чем)
     
  8. Flash

    Flash Нерд

    Вроде решил проблему, пересылая каждый элемент по отдельности.

    Фрагмент кода для ресивера:
    Код (C++):
        radio.read(&pac.axis, sizeof(pac.axis));
        while(!radio.available()){
        }
        radio.read(&pac.action, sizeof(pac.action));
        while(!radio.available()){
        }
        radio.read(&pac.information, sizeof(pac.information));
    Фрагмент кода для отправителя:
    Код (C++):
        radio.write(&pac.axis, sizeof(pac.axis));                  
        radio.write(&pac.action, sizeof(pac.action));
        radio.write(&pac.information, sizeof(pac.information));
    Вывод символа для его адекватного отображения выглядит тогда так:
    Код (C++):
      Serial.print(char(pac.axis));
     
    Daniil нравится это.
  9. b707

    b707 Гуру

    Flash - причина проблемы в том, что созданная вами структура на Вемосе и на ардуине имеет разный размер. Для проверки выведите в Сериал sizeof(pac) на обоих платах
     
  10. parovoZZ

    parovoZZ Гуру

    когда создаешь структуру для разных платформ, обязательно надо делать выравнивание полей, ибо каждый компилятор выравнивает по-своему. Даже с восьми битными полями. У меня малинка восьми битные поля выравняла по два байта, т.к. двухбайтные поля тоже были в структуре. Embedded программирование подразумевает не только хорошее владение языками и искусством программирование, но необходимо отменно знать архитектуру ядер программируемых платформ. Такие вот пироги.