Добрый вечер. Пытаюсь подключить нрф к вемосу. Данные отправленные с вемоса ловлю ардуинкой. Код (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, все работает как надо.
Вы отправляете размер структуры (sizeof),я не знаю что вы отправляете, но надо элементы структуры, обычно то, что у вас написано используют для массивов - у вас не массив
не совсем понимаю, как будут выглядеть функции write и read. В описании говориться, что надо передать указатель на данные для отправки/получения и количество байт. Или какие-то другие функции использовать?
Если я правильно понимаю, то там говорится о "строке", т.е. массиве. Попробуйте написать: Вы должны будете получить "х". Соответственно так нужно пройтись по всем элементам структуры. НО вопрос что будет передано для action, точнее что получено. Для разбирательства в этой проблеме смотрите ascii таблицу. Когда вы передаете байт равный 1, то символ, который вы увидете в терминале...зависит от терминала и его настроек.
Наверняка я не знаю. Гипотеза. Когда вы объявляете структуру в байтах, то в памяти мк выделяется 3 подряд идущих байта, в каждом из которых хранится нужные вам данные. тут вы даете указатель на переменную, который указывает на первый элемент структуры (axis). SizeOf сообщает, что объем данных для отправки = 3 байта. Процедура проходит по памяти и отправляет эти байты, т.о. программе кажется что формально вы ей пихнули массив из 3ех элементов. Когда же у вас int"ы, то sizeOf выдает 5, т.к. 2 инта это 4 байта + 1 байт от чара. И так же процедурка передает не думая 5 байт, будто бы это массив - тут моя гипотеза плавает, но не знаю в чем)
Вроде решил проблему, пересылая каждый элемент по отдельности. Фрагмент кода для ресивера: Код (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));
Flash - причина проблемы в том, что созданная вами структура на Вемосе и на ардуине имеет разный размер. Для проверки выведите в Сериал sizeof(pac) на обоих платах
когда создаешь структуру для разных платформ, обязательно надо делать выравнивание полей, ибо каждый компилятор выравнивает по-своему. Даже с восьми битными полями. У меня малинка восьми битные поля выравняла по два байта, т.к. двухбайтные поля тоже были в структуре. Embedded программирование подразумевает не только хорошее владение языками и искусством программирование, но необходимо отменно знать архитектуру ядер программируемых платформ. Такие вот пироги.