Olegus 0 15 октября, 2019 Опубликовано 15 октября, 2019 (изменено) · Жалоба Привет. Возникла необходимость взаимного обмена данными float между Matlab и Arduino. Взял пример https://github.com/leomariga/Simulink-Arduino-Serial. Но возникает проблема неустойчивого приема данных на Arduino. Могу два раза запустить число из Matlab в Arduino и затем опять в Matlab для отображения на графике все будет ок, а на третий раз бред полный потом несколько запусков все хорошо, потом опять бред или пару секунд норм, а потом все скачет прыгает, т.е. начинается раздрай. Передача с Arduino на Matlab идет устойчиво (передаются float без сбоя) значит проблема именно в передаче из Matlab в Arduino . Использую Header для проверки начала пакета. Может кто что подскажет. //In Arduino IDE Float(4 byte) and In Matlab Single(4 byte) --> We can exchange these varibales between Matlab and Arduino // Create a union to easily convert float to byte typedef union{ float number; // for this variable allocated 4byte uint8_t bytes[4]; // for this variable allocated 4*1byte(8 bit) = 4 byte } FLOATUNION_t; uint8_t test = 'A'; // for check transmitting packet uint8_t header = 0; // initial conditions // Create the variables you want to receive FLOATUNION_t myValue1; FLOATUNION_t myValue2; FLOATUNION_t myValue3; FLOATUNION_t myValue4; FLOATUNION_t myValue5; FLOATUNION_t myValue6; // Create the variables to send FLOATUNION_t send1; FLOATUNION_t send2; FLOATUNION_t send3; void setup() { // initialize serial, use the same boudrate in the Simulink Config block Serial.begin(38400); } void loop(){ // Get the floats from serial if (Serial.available()>1) { header = Serial.read(); if (header == test)// { myValue1.number = getFloat(); // Give your float a value myValue2.number = getFloat(); // Give your float a value myValue3.number = getFloat(); // Give your float a value myValue4.number = getFloat(); // Give your float a value myValue5.number = getFloat(); // Give your float a value myValue6.number = getFloat(); // Give your float a value } } // do something with numerals from serial send1.number =myValue1.number+myValue2.number; // new variables 2.4;// send2.number = myValue3.number+myValue4.number; // 3.6;// send3.number = myValue5.number+myValue6.number; //4.7;// // Print header: Important to avoid sync errors! Serial.write('A'); // Print float data for (int i=0; i<4; i++){ Serial.write(send1.bytes[i]); } for (int i=0; i<4; i++){ Serial.write(send2.bytes[i]); } for (int i=0; i<4; i++){ Serial.write(send3.bytes[i]); } // Print terminator Serial.print('\n'); //Serial.flush(); // Use the same delay in the Serial Receive block delay(50); } float getFloat(){ int cont = 0; FLOATUNION_t f; while (cont < 4 ){ f.bytes[cont] = Serial.read() ; cont = cont +1; } return f.number; } Изменено 15 октября, 2019 пользователем Olegus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 15 октября, 2019 Опубликовано 15 октября, 2019 · Жалоба 21 минуту назад, Olegus сказал: Но возникает проблема неустойчивого приема данных на Arduino. Проблема у Вас в том, что делаете какую-то фигню на букву 'х'. 21 минуту назад, Olegus сказал: // Print header: Important to avoid sync errors! Serial.write('A'); // Print float data for (int i=0; i<4; i++){ Serial.write(send1.bytes[i]); } for (int i=0; i<4; i++){ Serial.write(send2.bytes[i]); } for (int i=0; i<4; i++){ Serial.write(send3.bytes[i]); } // Print terminator Serial.print('\n'); Здесь передаёте свои флоаты и бинарном виде. При этом маркеры конца и начала кадра - как для текстового обмена. Внутри ваших float-ов тоже могут быть 'A' и '\n', а значит - на приёмной стороне невозможно буде однозначно определить границы кадра. Передавайте float-ы в текстовом виде (предварительно напечатав их sprintf()-ом). Если хотите передавать всё-таки в бинарном виде, то изучите любой связной кодонезависимый протокол. Например COBS или SLIP. И кодируйте передачу им. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegus 0 15 октября, 2019 Опубликовано 15 октября, 2019 · Жалоба Даже если так, то с передачей у меня как раз-то нет проблем (хотя на данном этапе я об этом думал что мои числа могут совпасть с значениями конца и начала- я просто выбрал для передачи числа заведомо не совпадающие). Эту проблему надо будет решать и наверно как вы правильно указали. Почему у меня прием на Arduino идет через раз? Если один раз проходит, а числа я не меняю (одни и тоже значение передаю) то совпадений для маркера начала пакета нет и Arduino принимает адекватно, но почему не постоянно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 15 октября, 2019 Опубликовано 15 октября, 2019 · Жалоба 21 минуту назад, Olegus сказал: Даже если так, то с передачей у меня как раз-то нет проблем (хотя на данном этапе я об этом думал что мои числа могут совпасть с значениями конца и начала- я просто выбрал для передачи числа заведомо не совпадающие). Эту проблему надо будет решать и наверно как вы правильно указали. У чукчи с писательством тоже нет проблем. Проблемы будут у тех, кто его произведения прочитать попробует. 21 минуту назад, Olegus сказал: Почему у меня прием на Arduino идет через раз? Если один раз проходит, а числа я не меняю "почему" - я Вам уже ответил в первом сообщении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться