Последовательная запись - символы ascii sedd с шестнадцатеричным значением в одной строке

Работаю над созданием контроллера для реквизита дома с привидениями. Пытаюсь заставить его взаимодействовать с устройством.

Смог использовать последовательный анализатор, чтобы увидеть, какие команды и значения отправляются.

шестнадцатеричные коды, передаваемые по последовательному каналу для ручного управления, - "40 4d 01", что переводится как "@M [?]".

третий байт 01 - это состояние конфигурации, в которое вы хотите его изменить. Я использую байт для хранения значения в диапазоне 0-255.

Я озадачен тем, как отправить 2 символа ASCII, но в одной и той же команде Serial.write() отправить исходное значение, или тем, как отправить их все в шестнадцатеричном формате. Я уверен, что это прямолинейно, и я просто не знаю о какой-то простой функции.

, 👍1

Обсуждение

гекс - это просто человеческое представление двоичного кода ... проще написать "4d` вместо "01001101"... это всего лишь число ... десятичная дробь 77, @jsotola

Если вы видите "@M[?]", это означает, что вы читаете его как [ASCII](https://www.asciitable.com). "40 шестнадцатеричный в ASCII-это"@". Вы, вероятно, отправляете данные правильно, если используете Serail.write (), но когда вы читаете данные с помощью uint8_t incomingByte = Serial.read (), возврат будет в байтах(т. Е. uint8_t) вместо символа, чтобы увидеть правильный шестнадцатеричный код, используйте Serial.print(incomingByte, ШЕСТНАДЦАТЕРИЧНЫЙ);`., @hcheung


2 ответа


2

Для этого вы можете использовать массив байтов:

    // в соответствующем месте вашего кода:
    byte message[] = { '@', 'M', 0x01 };
    Serial.write(message, sizeof message);

Если вам нужно, вы можете подготовить массив и просто присвоить значение:

byte message[] = { '@', 'M', 0 };

// ...

    byte value = 0x01; // или любое другое назначение

    // в соответствующем месте вашего кода:
    message[2] = value;
    Serial.write(message, sizeof message);
,

4

Прежде всего, я оспорю ваше предположение о том, что вы должны отправить три байта в одном вызове Serial.write(). В этом нет никакого реального преимущества. Последовательный вывод обрабатывается через буфер памяти , который используется последовательным портом в рамках процедуры обслуживания прерываний. Функция Serial.write() выполняет запись только в этот буфер памяти. Таким образом, вы можете просто:

Serial.write("@M");
Serial.write(1);

и получатель не увидит разницы. Между "М" и " 1 " не будет разрыва. В последовательном соединении нет понятия “сообщения” или “кадры”, если только протокол верхнего уровня не добавляет свой собственный кадр, чего здесь нет.

Далее, если вы действительно хотите сделать один звонок (как бы бесполезно это ни было), вы могли бы

Serial.write("@M\1");

Однако это не сработает, если последний байт равен нулю. Метод, показанный busybee, является более общим, и он может отправлять байт с нулевым значением.

,