Нестабильная передача 2 байт по Serial

olegsidorovich
Offline
Зарегистрирован: 30.08.2019
Может кто-нибудь подскажет. Передаю данные из Симулинака Матлаба по Серийному порту в Arduino Uno, 
наблюдаю результат (передаю для примера число 400) в монитор Ардуино, вначале идут 400, а затем начинают стабильно выдавать 36865.
Как я понимаю, судя по числам, идет сдвиг при чтении или ...?
(400 =     0000  0001  1001   0000)
(36865 = 1001  0000  0000   0001)
 
Вот код Ардуино
#include <SoftwareSerial.h>
#define rxPin 10
#define txPin 11
unsigned int inByte1; 

byte bufferM1[5];
unsigned long MyLongValue;
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup() {
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  mySerial.begin(38400);
  Serial.begin(38400);
  while (!mySerial) {
    ; // ожидаем подключения последовательного порта. Нужно только для Leonardo
  }
 
}
void loop()
{     
   if (mySerial.available()) //>=2
    { MyLongValue = 0;
      bufferM1[2] = {0};
     int x = mySerial.readBytes(bufferM1, 2);
     MyLongValue = (unsigned long)bufferM1[0]<<8 | bufferM1[1];
     Serial.println(MyLongValue, DEC);
       
       }
    
 }
b707
Offline
Зарегистрирован: 26.05.2017

вы, похоже, не понимаете разницу между чслами, байтами. и строками. У вас Матлаб, скорее всего, отправляет в порт строку "400", а вы пытаетесь читать байты. вот нефига и не выходит. Не говоря уж о том, что у вас в коде куча детских ошибок

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

Когда я из матлаба считываю беззнаковое 8-битное число таким же образом все без проблем  получается. Из матлаба я отсылаю именно Binary  and 8-bit unsigned integer. 

Аналогично при чтении 16 бит. Тут как видно я их склеиваю, а в Матлаб устанавливаю: Binary  and 16-bit unsigned integer. 

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

MaksVV
Offline
Зарегистрирован: 06.08.2015

вот как раз, если выставляете бинарное или шестнадцатиричное, то это и говорит, что скорее всего, в виде текста число отправляется. Потому как если бы числом, то в компьютере нет понятия шестнадцатиричное или десятичное, данные всегда двоичные. А остальное просто для удобства отображения. Число в виде числа нельзя отправить десятичное или шестнацатиричное   - оно всегда двоичное. 

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

Так я и высталяю Output Format: Binary

a Prеcision: 16-bit unsigned integer.

 На рисунке в меню настройки блока матлаб хреново но видно.

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

а так да,  может и сдвигаться если данные голые и нормально не упакованы.

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

Да и в начале потока приема я получаю то что надо, значит изначально передача идейно правильная. Тоже рисунок монитора ардуино, выше.

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

MaksVV пишет:

а так да,  может и сдвигаться если данные голые и нормально не упакованы.

Это на стороне Матлаба?

MaksVV
Offline
Зарегистрирован: 06.08.2015

да, но в общем и на приёмной стороне, конечно, должно правильно распаковываться. Например первый байт в посылке делаем со старшим битом всегда "1"  и он несёт инфу, сколько байт в посылке. Далее ваши байты данных, последний байт - контрольная сумма ( как вариант просто сложение всех предыдущих байт). 

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

или ввести маркеры начала и конца сообщения. и по ним ориентироваться при чтении посылки

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

Да я будучи новичком наверное такое не подниму))

b707
Offline
Зарегистрирован: 26.05.2017

olegsidorovich пишет:

Да я будучи новичком наверное такое не подниму))

все когда-то были новичками.

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

Может ссылочку дадите с примером или с чего начать, если можно.

MaksVV
Offline
Зарегистрирован: 06.08.2015

вот пример приёмника. Можно из него переделать