Отправка данных с шестнадцатеричными значениями 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), оно работает так, как и ожидалось.

, 👍0

Обсуждение

Шестнадцатеричное число, по определению, представляет собой последовательность символов ASCII., @Edgar Bonet

Самое запутанное, что когда я пишу что-то вроде Serial.write(2), оно работает так, как и ожидалось. ... вы делаете Serial.write('2') ... это не одно и то же ... ваш вопрос не об Arduino ... он о языке C++, @jsotola

Возможно, вам захочется проверить с помощью Serial.print(cups_qty, HEX);, какие данные вы фактически получили., @the busybee


1 ответ


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