Преобразование шестнадцатеричной строки в значение с плавающей запятой

Я считываю данные со счетчика энергии по протоколу Modbus и получаю оттуда шестнадцатеричные значения. Я хочу преобразовать эту шестнадцатеричную строку в значение с плавающей запятой. Например, 0x416f0000 обозначает значение 14,9375.Ссылка

Может кто-нибудь помочь мне, как это сделать в Arduino IDE?

, 👍1

Обсуждение

Вы имеете в виду Modbus ASCII, верно? Не-ASCII Modbus не использует шестнадцатеричный формат., @Edgar Bonet


1 ответ


Лучший ответ:

3

Если у вас действительно есть строка ASCII шестнадцатеричных чисел (а не необработанный двоичный файл с плавающей запятой), то лучшим вариантом может быть выполнение преобразования в два шага:

  1. преобразуйте строку в 32-битное беззнаковое число, используя strtoul()
  2. переинтерпретировать двоичный шаблон этого целого числа как число с плавающей запятой.

Например, следующая программа:

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 в пример выше).

,