Как правильно принять байты с последовательного порта

Deemon
Offline
Зарегистрирован: 07.06.2021
Доброго времени суток!
В ходе написания скетча и отладки застопорился на олном моменте, и че-то начал буксовать.
Задача: плата Arduino Mega 2560. На COM порт от устройства(для отладки использую пока UART) приходят данные в формате:
3 числа(тип данных int, мне нужен диапазон 0-15000) и признак окончания передачи (по ASCII код 13 и 10). Итого 8 байт.
Считываю с COM порта так:
 
byte ByteArr[8];
  
if (Serial.available()>0){     // проверка, что пришли все байты    
    
    int x=Serial.available();  // Общее кол-во принятых байт
    Serial.readBytesUntil(10,ByteArr,7);   // 10 - это по ASCII перевод строки
    for (i=0; i<8; i=i+1){
	   Serial.println(ByteArr[i],BIN);
    }
}
Собственно вопрос следующий:
Как правильно сформировать в мониторе порта строчку из 3х цифр и признака оконачния, например 0999 11000 12000 0x0D 0х0a 
Если из монитора порта отправить например 15000 (только одно число), то println(ByteArr[i]) разбивает это на отдельные числа 1,5,0,0,0 - т.е. каждую цифру он видит как один байт, а мне надо чтобы в 2х байтах было первое число 15000. Подскажите (советом, ссылками), что я делаю не так. В Arduino я новичек, прошу сильно не ругать))) 
 
Заранее спасибо!

 

rkit
Offline
Зарегистрирован: 23.11.2016

Монитор порта отправляет данные закодированные как текст, и принимать нужно как текст. Хочешь отправлять двоичную информацию - используй другой софт.

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

Deemon пишет:

Собственно вопрос следующий:
Как правильно сформировать в мониторе порта строчку из 3х цифр и признака оконачния, например 0999 11000 12000 0x0D 0х0a

У вас в самом вопросе противоречие.

Если вам надо отсылать данные в бинарном виде - то надо формировать не строчку, а массив из 8 байт. В первые два байта массива запишите свое первое число в бинарном виде (тип инт как раз сорстоит из двух байт), в следующие два байта - второе число. потом - так же третье.

После этого можете отослать свои 0x0D 0х0a...  Хотя, вообще-то, использовать для приема двоичных данных "текстовую" функцию readBytesUntil я бы не советовал, потому что в ваших бинарных данных легко может попасться байт 0x0A и функция остановится раньше времени

Либо, как правильно советует rkit - если отправляете по сути строчку "15000" - то и принимайте эту строчку и напишите функцию по обратному преобразованию строки в число

Deemon
Offline
Зарегистрирован: 07.06.2021
Спасибо большое за ответы, по поводу монитора порта тоже!
Получается надо придерживаться следующего алгоритма:
 
1. Для отладки на ПК создаю виртуальный COM порт и его программно соединению, ну например с COM Port Data Emulator куда в двоичной системе загоняю для теста 3 числа и признаки окончания передачи
2. В скетче я собираю функцией Serial.readBytes() в буфер и проверяю, если последние 2 байта это признаки окончания, то остальные байты раскидываю попарно как int числа
 
Правильно? 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Deemon пишет:

1. Для отладки на ПК создаю виртуальный COM порт и его программно соединению, ну например с COM Port Data Emulator куда в двоичной системе загоняю для теста 3 числа и признаки окончания передачи
Только для такого случая Вы неудачно выбрали признак окончания передачи, т.к. он также лежит в диапазоне от 0 до 15000 и таким образом неотличим от других чисел. Лучше дял этой цели использовать число вне диапазона 0-15000, например, 65535.
sadman41
Offline
Зарегистрирован: 19.10.2016

Terminal 1.9b умеет передавать байты: $3A$A3$0A$0D
И ставить никаких эмуляторов-виртуализаторов не нужно.

Green
Offline
Зарегистрирован: 01.10.2015

sadman41 пишет:
Terminal 1.9b умеет передавать байты: $3A$A3$0A$0D
... Можно закрепить кучу последовательностей за Fn клавишами и посылать вручную или автоматом через заданные временные промежутки. Можно писать свои скрипты в самом терминале...