Преобразование шестнадцатеричной строки в значение с плавающей запятой
Я считываю данные со счетчика энергии по протоколу Modbus и получаю оттуда шестнадцатеричные значения. Я хочу преобразовать эту шестнадцатеричную строку в значение с плавающей запятой. Например, 0x416f0000 обозначает значение 14,9375.Ссылка
Может кто-нибудь помочь мне, как это сделать в Arduino IDE?
@Prateek Goyal, 👍1
Обсуждение1 ответ
Лучший ответ:
Если у вас действительно есть строка ASCII шестнадцатеричных чисел (а не необработанный двоичный файл с плавающей запятой), то лучшим вариантом может быть выполнение преобразования в два шага:
- преобразуйте строку в 32-битное беззнаковое число, используя
strtoul()
- переинтерпретировать двоичный шаблон этого целого числа как число с плавающей запятой.
Например, следующая программа:
void setup() {
const char modbus_data[] = "416F0000";
union {
uint32_t i;
float f;
} data;
data.i = strtoul(modbus_data, NULL, 16);
Serial.begin(9600);
Serial.println(data.f, 4);
}
void loop(){}
печатает 14.9375
.
Обратите внимание, что для правильной работы strtoul()
шестнадцатеричная строка должна быть
за которым следует символ, который не является допустимой шестнадцатеричной цифрой (\0
в
пример выше).
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
Вы имеете в виду Modbus ASCII, верно? Не-ASCII Modbus не использует шестнадцатеричный формат., @Edgar Bonet