Есть сие struct package { int packageLength; char adr[3]; char badr[3]; char command[1]; char addcommand[addInfo]; char crc[2]; }; //отправляем структуру ??? //struct package = Serial.write(str); Как отправить эту структуру по сериал ? Спасибо за ваше время!
Например, так: Код (Text): package p; for (int i = 0; i < sizeof(p); i++) { Serial.write(*((char*)&p+i)); } Только не забывайте, что компиляторы любят делать выравнивание полей структуры в памяти, в результате чего одна и та же структура в бинарном виде может выглядеть по разному для разных компьютеров.
У меня явно проблемы с использованием поинтеров. есть такой код и такая ошибка : 59: error: array bound is not an integer constant Явно нужно выделить статичное место в памяти под "char addcommand[addInfo];" так как это addInfo будет скакать всё время. Я пробовал мудрил, но так и не осилил. int packageLength = 0; char adr[3]; char badr[3]; int addInfo=0; char zeroByte[1]; char command[1]; char crc[2]; void setup() { Serial.begin(9600); // открывает последовательный порт, устанавливает скорость 9600 бит/c } void loop() { if (Serial.available() > 0 ) { if (packageLength == 0) { packageLength = Serial.read(); addInfo = packageLength - 11; //nahodim dlinnu bloka dopolnitelnoi informazii } if (Serial.available() > packageLength - 2 ) { //schityvaem addr adr[0] = Serial.read(); adr[1] = Serial.read(); adr[2] = Serial.read(); //schityvaem broadcast adr badr[0] = Serial.read(); badr[1] = Serial.read(); badr[2] = Serial.read(); //schityvaem nulevoi zeroByte[0] = Serial.read(); // nuzno li delat proverku na nol? //schityvaem komanda command[0] = Serial.read(); //schityvaem dopol inf char addcommand[addInfo]; for (int i=0; i <= addInfo; i++) { addcommand[addInfo] = Serial.read(); } //schityvaem crc crc[0] = Serial.read(); crc[1] = Serial.read(); // sosdajem strukturu struct package { int packageLength; char adr[3]; char badr[3]; char command[1]; char addcommand[addInfo]; char crc[2]; }; //отправляем структуру ??? package p; for (int i = 0; i < sizeof(p); i++) { Serial.write(*((char*)&p+i)); } packageLength = 0; } } } Я нуб, потому вопрос, как с этим бороться? *((char*)&p+i) Если вам не трудно, как это понять?
Вы не можете выделять динамический массив, таким же образом, как статический. Выхода два: 1) оцениваете максимальную длину сообщения и делаете статический массив нужного размера заранее; 2) используете оператор new или функцию malloc для динамического выделения памяти; освобождать память не забывайте, у контроллера ее и так крайне мало.
p - переменная типа package &p - адрес переменной p (char*)&p - адрес переменной p приведенный к типу (char*) - адресу на массив байт, т.е. здесь мы маскируем структуру package под массив байт (char*)&p+i - адрес i-го элемента массива байт, в которых хранится переменная p *((char*)&p+i) - разыменует полученный выше указатель, т.е. достаем байт по адресу переменной p + i байт
Альтернативная запись: Код (Text): ((char*)&p)[i] - i-ый элемент массива байт, в которых хранится структура
У меня Ардуина связывается не со своим собратом. А с совершенно другим контроллером. Вот только я ещё не придумал, как будет происходить адресация. То есть как ардуинка узнает, что сообщение приходит именно ей, чтобы не забивать и так малую память.
Очень интересная затея. Как я понимаю, мы создаём на каждом конце по структуре, которую будем юзать. И с помощью этой библиотеке обмениваться данными с проверкой суммы. Круто конечно, надо пробовать, сразу отпадает главная проблема в памяти.