Отправка данных с шестнадцатеричными значениями Serial.write()
Я использую ESP32-C3 в качестве аппаратного обеспечения и Arduino IDE в качестве программного ядра.
Я получаю данные с сервера MQTT и хочу отправить их на другую плату, используя последовательный порт как шестнадцатеричное число. Однако они отправляются через последовательный порт как символы ASCII.
Вот код
unsigned char messageTemp; //данные, полученные с сервера MQTT
unsigned char cups_qty; //данные для передачи на последовательный порт
cups_qty = messageTemp;
Serial.write(cups_qty);
Например, если я получаю messageTemp = 2
и отправляю его в переменную cups_qty
, а затем отправляю cups_qty
в последовательный порт через Serial.write(cups_qty);
, я получаю эквивалентный символ, а не число.
Например:
msg from MQTT >>> messageTemp = 2
cups_qty = messageTemp;
send over serial port >>> Serial.write(cups_qty);
Что я вижу на последовательном терминале RealTerm
(Display As Ascii) >>> 2
(Display As Hex) >>> 32
(Display As int8) >>> 50
Что я хочу видеть на терминале:
(Display As Ascii) >>> something unknown
(Display As Hex) >>> 02
(Display As int8) >>> 2
Самое запутанное, что когда я пишу что-то вроде Serial.write(2)
, оно работает так, как и ожидалось.
@Eric Matevosian, 👍0
Обсуждение1 ответ
Вы написали:
если я получаю
messageTemp = 2
и отправляю его в переменнуюcups_qty
и затем отправьтеcups_qty
на последовательный порт черезSerial.write(cups_qty);
, я получите эквивалентный символ, а не число.
Это неверно. Если вы Serial.write(2)
вы получите, в
на другом конце — байт с числовым значением 2. Попробуйте!
Функция Serial.write()
передает двоичные числа как есть, без
попытка любого преобразования. Следующие строки:
Serial.write('2');
Serial.write(0x32);
Serial.write(50);
Serial.print(2);
все делают одно и то же: передают байт с числовым значением 50.
три выражения '2'
, 0x32
и 50
— это всего лишь три способа записи
тот же номер. Обратите внимание, что в отличие от Serial.write()
, Serial.print()
форматирует числа в ASCII перед передачей.
Похоже, ваш сервер MQTT отправил вам число в формате ASCII, которое вы
наверное не ожидал. Если вы точно знаете, что это один
Цифру ASCII можно преобразовать в двоичную форму, вычитая код ASCII
для '0'
, а именно 48:
Serial.write(messageTemp - '0'); // отправка messageTemp в двоичном формате
спасибо Эдгар за ответ. Я сделал то, что вы предложили >>> Serial.write(messageTemp - '0'); и это работает, но только когда полученные данные состоят всего из одной цифры. например, сервер MQTT отправляет 4 полезных данных >> 2, 80, 4, 5, и после преобразования я получаю следующее через последовательный порт в формате HEX >> 0x02, 0X38, 0x04, 0X05, данные 80 преобразуются в 0x38, что является форматом ASCII цифры 8! что вы предлагаете? входящие данные могут состоять из 1, 2 или 3 цифр, @Eric Matevosian
например, я хочу получить данные 80 как >> 0X50 или данные 90 как >> 0X5A, @Eric Matevosian
@EricMatevosian: Вы хотите прочитать число, отформатированное как текстовая строка. Это называется _парсинг_. Поищите в Интернете «Arduino parse number»., @Edgar Bonet
- Как прочитать входящие ШЕСТНАДЦАТИРИЧНОЕ значение из serial метод read ()?
- Ошибка чтения флэш-памяти, 1000
- Нужен ESP32 для использования 3 последовательных портов
- Не могу подключиться к плате ESP32 через последовательный порт
- Почему Serial.write() работает, а Serial.print() нет?
- Нужен пример того, как отправлять КОМАНДЫ AT на модуль SIm7000E GPS+LTE из ESP32 и читать эти ответы в последовательном мониторе
- ESP32 Arduino Bluetooth Serial не подключается повторно после отключения
- Как преобразовать строку в шестнадцатеричный массив
Шестнадцатеричное число, по определению, представляет собой последовательность символов ASCII., @Edgar Bonet
Самое запутанное, что когда я пишу что-то вроде Serial.write(2), оно работает так, как и ожидалось.
... вы делаетеSerial.write('2')
... это не одно и то же ... ваш вопрос не об Arduino ... он о языке C++, @jsotolaВозможно, вам захочется проверить с помощью
Serial.print(cups_qty, HEX);
, какие данные вы фактически получили., @the busybee