Передача 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 перед помещением в переменную (см. описание функции).
Спасибо, попробую выполнить Ваши рекомендации.