Нестабильная передача 2 байт по Serial
- Войдите на сайт для отправки комментариев
Пт, 30/08/2019 - 13:03
Может кто-нибудь подскажет. Передаю данные из Симулинака Матлаба по Серийному порту в 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); } }
вы, похоже, не понимаете разницу между чслами, байтами. и строками. У вас Матлаб, скорее всего, отправляет в порт строку "400", а вы пытаетесь читать байты. вот нефига и не выходит. Не говоря уж о том, что у вас в коде куча детских ошибок
Когда я из матлаба считываю беззнаковое 8-битное число таким же образом все без проблем получается. Из матлаба я отсылаю именно Binary and 8-bit unsigned integer.
Аналогично при чтении 16 бит. Тут как видно я их склеиваю, а в Матлаб устанавливаю: Binary and 16-bit unsigned integer.
вот как раз, если выставляете бинарное или шестнадцатиричное, то это и говорит, что скорее всего, в виде текста число отправляется. Потому как если бы числом, то в компьютере нет понятия шестнадцатиричное или десятичное, данные всегда двоичные. А остальное просто для удобства отображения. Число в виде числа нельзя отправить десятичное или шестнацатиричное - оно всегда двоичное.
Так я и высталяю Output Format: Binary
a Prеcision: 16-bit unsigned integer.
На рисунке в меню настройки блока матлаб хреново но видно.
а так да, может и сдвигаться если данные голые и нормально не упакованы.
Да и в начале потока приема я получаю то что надо, значит изначально передача идейно правильная. Тоже рисунок монитора ардуино, выше.
а так да, может и сдвигаться если данные голые и нормально не упакованы.
Это на стороне Матлаба?
да, но в общем и на приёмной стороне, конечно, должно правильно распаковываться. Например первый байт в посылке делаем со старшим битом всегда "1" и он несёт инфу, сколько байт в посылке. Далее ваши байты данных, последний байт - контрольная сумма ( как вариант просто сложение всех предыдущих байт).
или ввести маркеры начала и конца сообщения. и по ним ориентироваться при чтении посылки
Да я будучи новичком наверное такое не подниму))
Да я будучи новичком наверное такое не подниму))
все когда-то были новичками.
Может ссылочку дадите с примером или с чего начать, если можно.
вот пример приёмника. Можно из него переделать