Как правильно принять байты с последовательного порта
- Войдите на сайт для отправки комментариев
Пнд, 09/08/2021 - 13:32
Доброго времени суток!
В ходе написания скетча и отладки застопорился на олном моменте, и че-то начал буксовать.
Задача: плата 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 я новичек, прошу сильно не ругать)))
Заранее спасибо!
Монитор порта отправляет данные закодированные как текст, и принимать нужно как текст. Хочешь отправлять двоичную информацию - используй другой софт.
У вас в самом вопросе противоречие.
Если вам надо отсылать данные в бинарном виде - то надо формировать не строчку, а массив из 8 байт. В первые два байта массива запишите свое первое число в бинарном виде (тип инт как раз сорстоит из двух байт), в следующие два байта - второе число. потом - так же третье.
После этого можете отослать свои 0x0D 0х0a... Хотя, вообще-то, использовать для приема двоичных данных "текстовую" функцию readBytesUntil я бы не советовал, потому что в ваших бинарных данных легко может попасться байт 0x0A и функция остановится раньше времени
Либо, как правильно советует rkit - если отправляете по сути строчку "15000" - то и принимайте эту строчку и напишите функцию по обратному преобразованию строки в число
Terminal 1.9b умеет передавать байты: $3A$A3$0A$0D
И ставить никаких эмуляторов-виртуализаторов не нужно.