Передача float из Matlab в Arduino и обратно
- Войдите на сайт для отправки комментариев
Втр, 15/10/2019 - 13:30
Привет. Возникла необходимость взаимного обмена данными 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; }
строка 30, очень высокая скорость передачи накладывает очень жесткие требования для кабеля, как на его качество так и на длину. Как ее понизить думайте сами. Не уверен, что это единственная проблема, но я бы начал с нее. Судя по описанию у вас потери на кабеле. Есть вероятность, что некоторые сложности добавляет USB порт - пробуйте на разных портах, особенно это касается выносных портов для системных блоков.
и попробуйте getFloat (стр 77) перенести до loop разные версии ИДЭ по разному к такой записи относятся.
#81. read() должен осуществляться только тогда, когда в буфере что-то есть или результат должен проверяться на равенство с -1 перед помещением в переменную (см. описание функции).
Спасибо, попробую выполнить Ваши рекомендации.