Передача float из Matlab в Arduino и обратно

olegsidorovich
Offline
Зарегистрирован: 30.08.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;
}


 
Гриша
Offline
Зарегистрирован: 27.04.2014

строка 30, очень высокая скорость передачи накладывает очень жесткие требования для кабеля, как на его качество так и на длину. Как ее понизить думайте сами. Не уверен, что это единственная проблема, но я бы начал с нее. Судя по описанию у вас потери на кабеле. Есть вероятность, что некоторые сложности добавляет USB порт - пробуйте на разных портах, особенно это касается выносных портов для системных блоков.

и попробуйте getFloat (стр 77) перенести до loop разные версии ИДЭ по разному к такой записи относятся.

sadman41
Offline
Зарегистрирован: 19.10.2016

#81. read() должен осуществляться только тогда, когда в буфере что-то есть или результат должен проверяться на равенство с -1 перед помещением в переменную (см. описание функции).

olegsidorovich
Offline
Зарегистрирован: 30.08.2019

Спасибо, попробую выполнить Ваши рекомендации.