ESP8266 Преобразование и проверка ASCII в HEX
Я пытаюсь преобразовать ASCII в шестнадцатеричный формат и проверить, соответствует ли шестнадцатеричный код тому шестнадцатеричному коду, который мне нужен.
Например:
1B 42 05
это означает B
в ASCII, мне нужно проверить, равен ли этот шестнадцатеричный код 1B 42 05
.
Здесь мне нужно отправить преобразованный шестнадцатеричный код из кода ASCII, используя SoftwareSerial
.
Пример:
02 20 2D 33 30 32 35 30 20 6B 67 0D 0A 03
Мне нужно преобразовать в
-30250 kg
2 ответа
Преобразовать шестнадцатеричные цифры ASCII достаточно просто. Вот небольшая функция, которую я использую постоянно:
uint8_t h2d(char hex) {
if(hex > 0x39) hex -= 7; // корректируем верхний или нижний регистр шестнадцатеричных букв
return(hex & 0xf);
}
Передайте ему одну шестнадцатеричную цифру как переменную char
, и он вернет число от 0 до 15.
Чтобы преобразовать пару символов в 8-битное значение, просто вызовите его дважды для каждого символа, сдвиньте один из них на 4 бита влево и выполните ИЛИ их вместе. Например:
uint8_t h2d2(char h1, char h2) {
return (h2d(h1)<<4) | h2d(h2);
}
Это даст вам число от 0 до 255 (или 016 и FF16 или 08 и 377 8...)
Как правильно получать и разделять входящие данные — это совсем другая тема, но это и это возможно, вам поможет.
Небольшое пояснение о HEX и ASCII:
О HEX
Необработанные компьютерные данные состоят из нулей и единиц. Людям трудно прочитать (длинный) ряд нулей и единиц. Вы можете представить такую строку (определенной длины) десятичным числом, но тогда связь с базовыми битами не будет очевидна. По этой причине используется шестнадцатеричное представление (HEX) (шестнадцатеричное слово происходит от греческого языка и означает 16.
Четыре бита могут представлять 16 различных ситуаций (= 16 различных комбинаций нулей и единиц). Шестнадцатеричная цифра, принадлежащая каждой комбинации:
0000 = 0; 0001 = 1; 0010 = 2; 0011 = 3; 0100 = 4; 0101 = 5; 0110 = 6; 0111 = 7
1000 = 8; 1001 = 9; 1010 = А; 1011 = Б; 1100 = С; 1101 = Д; 1110 = Е; 1111 = Ф
Когда вы запомните эти 16 случаев (из которых первые 10 просты, поскольку это просто двоичный счет), вы сразу узнаете, какой битовый шаблон принадлежит шестнадцатеричному числу, и наоборот. Например: шестнадцатеричное значение 5A = 01011010.
Об ASCII
Компьютерные данные содержат не только числа, но и текст. Поскольку компьютер может обрабатывать только биты (нули и/или единицы), нам необходимо решить, как буквы (символы) будут представлены битовыми комбинациями. И желательно стандартизированным способом, чтобы разные компьютеры могли обрабатывать текст друг друга. К сожалению, существует более одного стандарта, но наиболее часто используется стандарт ASCII (см.: https://en.wikipedia. org/wiki/ASCII).
Стандарт ASCII использует 7-битные коды и определяет не только символы, но и «коды управления», например, для «перевода строки» и «возврата каретки». Часто эти 7 бит хранятся в одном байте (самый левый восьмой бит равен 0) и могут быть представлены двумя шестнадцатеричными цифрами.
Без дополнительной информации никто не сможет сказать, что представляет собой строка битов. Это одна из причин использования типов данных. Они сообщают нам, что представляет собой строка битов и сколько бит (или байтов) используется для представления.
Таким образом, шестнадцатеричное представление вашей строки из 3 байтов — это «1B 42 05», и, если это символы, это может означать (посмотрите на таблицу ASCII): «ESCAPE B ENQ». В котором «ESCAPE» и «ENQ» являются управляющими кодами, значение которых зависит от протокола связи. Вторая строка (14 байт) может означать: «STX SPACE - 3 0 2 5 0 SPACE кг CR LF ETX». STX и ETX означают «НАЧАЛО ТЕКСТА» и «КОНЕЦ ТЕКСТА». «LF» означает «ПЕРЕВОД СТРОКИ», а «CR» означает «ВОЗВРАТ КАРЕТКИ».
Я надеюсь, что благодаря этому объяснению вы получите лучшее представление о HEX и ASCII и теперь сможете понять, как обращаться с вашими данными.
- AT-команда не отвечает на последовательный монитор
- Получить данные с сайта с помощью ESP8266 с помощью AT-команд
- Программное обеспечениеSerial с ESP8266
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Отправить строку данных из Arduino UNO в ESP8266-01
- Последовательная связь arduino mega и D1 Wemos Mini
- Нет соответствующей функции для вызова SoftwareSerial::SoftwareSerial(int&,int&)? Как исправить эту проблему
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
вы не можете преобразовать 1B в HEX, потому что это шестнадцатеричное представление числа. это похоже на то, если бы вы сказали, что вам нужно преобразовать 42 в десятичное число. вы можете преобразовать строку «1B» в байтовое значение., @Juraj
1B 42 05
— это больше, чем простоB
...... обратитесь к таблицам ASCII., @jsotolaВаш пример выглядит как строка последовательного протокола...
02 20 2D 33 30 32 35 30 20 6B 67 0D 0A 03
соответствует<stx> -30250 кг<cr><lf><etx>
. Так что вам нужно сделать немного больше, чем просто шестнадцатеричный код в ascii, @Andre Courchesne