Перейти к содержанию
    

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

Привет. Возникла необходимость взаимного обмена данными  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;
}

 

Изменено пользователем Olegus

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. И кодируйте передачу им.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Даже если так, то с передачей у меня как раз-то нет проблем (хотя на данном этапе я об этом думал что мои числа могут совпасть с значениями конца и начала- я просто выбрал для передачи числа заведомо не совпадающие). Эту проблему надо будет решать и наверно как вы правильно указали.

Почему у меня прием на Arduino идет через раз? Если  один раз проходит, а числа я не меняю (одни и тоже значение передаю) то совпадений для маркера начала пакета нет и Arduino принимает адекватно, но почему не постоянно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, Olegus сказал:

Даже если так, то с передачей у меня как раз-то нет проблем (хотя на данном этапе я об этом думал что мои числа могут совпасть с значениями конца и начала- я просто выбрал для передачи числа заведомо не совпадающие). Эту проблему надо будет решать и наверно как вы правильно указали.

У чукчи с писательством тоже нет проблем. Проблемы будут у тех, кто его произведения прочитать попробует.  :biggrin:

21 минуту назад, Olegus сказал:

Почему у меня прием на Arduino идет через раз? Если  один раз проходит, а числа я не меняю

"почему" - я Вам уже ответил в первом сообщении.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...