Последовательная запись - символы ascii sedd с шестнадцатеричным значением в одной строке
Работаю над созданием контроллера для реквизита дома с привидениями. Пытаюсь заставить его взаимодействовать с устройством.
Смог использовать последовательный анализатор, чтобы увидеть, какие команды и значения отправляются.
шестнадцатеричные коды, передаваемые по последовательному каналу для ручного управления, - "40 4d 01", что переводится как "@M [?]".
третий байт 01 - это состояние конфигурации, в которое вы хотите его изменить. Я использую байт для хранения значения в диапазоне 0-255.
Я озадачен тем, как отправить 2 символа ASCII, но в одной и той же команде Serial.write() отправить исходное значение, или тем, как отправить их все в шестнадцатеричном формате. Я уверен, что это прямолинейно, и я просто не знаю о какой-то простой функции.
@tookys, 👍1
Обсуждение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);
Прежде всего, я оспорю ваше предположение о том, что вы должны отправить
три байта в одном вызове Serial.write()
. В этом нет никакого реального
преимущества. Последовательный вывод обрабатывается через буфер памяти
, который используется последовательным портом в рамках процедуры обслуживания прерываний.
Функция Serial.write()
выполняет запись только в этот буфер памяти. Таким образом, вы можете
просто:
Serial.write("@M");
Serial.write(1);
и получатель не увидит разницы.
Между "М"
и " 1 " не будет разрыва. В последовательном соединении нет понятия “сообщения” или
“кадры”, если только протокол верхнего уровня не добавляет свой собственный
кадр, чего здесь нет.
Далее, если вы действительно хотите сделать один звонок (как бы бесполезно это ни было), вы могли бы
Serial.write("@M\1");
Однако это не сработает, если последний байт равен нулю. Метод, показанный busybee, является более общим, и он может отправлять байт с нулевым значением.
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
гекс - это просто человеческое представление двоичного кода ... проще написать "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