Как восстановить числовые данные, отправленные Arduino в двоичном виде

Я разработчик C#, и эти преобразования данных C++ меня убивают.

У меня есть Arduino, отправляющий двоичные данные через LoRaWAN в AzureIOT. Я пытаюсь декодировать полезные данные Temp/Humid/Bat, которые я извлекаю из AzureIOT Hub.

Вот пример метода, который я использую на C# для анализа массива байтов. Как мне преобразовать эти числа обратно в их фактические значения после того, как я их проанализирую?

Вот входные данные на стороне датчика:

Т=74,48

RH=45,20

Напряжение батареи: 3332

Спасибо. Вот как вводились данные:

float temperature = readDHTTemperature(); //этот метод печатает T в последовательный порт
float humidity = readDHTHumidity(); //этот метод печатает H в последовательный порт
uint16_t batteryVoltage = readBattery(true);
delay(100);

unsigned char *puc;

puc = (unsigned char *)(&temperature);
appDataSize = 10;
appData[0] = puc[0];
appData[1] = puc[1];
appData[2] = puc[2];
appData[3] = puc[3];


puc = (unsigned char *)(&humidity);
appData[4] = puc[0];
appData[5] = puc[1];
appData[6] = puc[2];
appData[7] = puc[3];

appData[8] = (uint8_t)(batteryVoltage>>8);
appData[9] = (uint8_t)batteryVoltage;

Вот результат:

private static void BytesToString()
{
    var hexStringFromPayLoad = "MzOYQgAAHEINBA==";
    var bytes = Base64Decode(hexStringFromPayLoad);

    Console.WriteLine($"Temp: {bytes[0]}, {bytes[1]}, {bytes[2]}, {bytes[3]}");
    Console.WriteLine($"Humid: {bytes[4]}, {bytes[5]}, {bytes[6]}, {bytes[7]}");
    Console.WriteLine($"Bat: {bytes[8]}, {bytes[9]}");

    /*
    Temp: 51, 51, 152, 66
    Humid: 0, 0, 28, 66
    Bat: 13, 4
    */
}

, 👍-1

Обсуждение

каковы полученные данные полезной нагрузки в шестнадцатеричном формате?, @jsotola

https://stackoverflow.com/questions/26310249/converting-4-raw-bytes-into-32-bit-floating-point, @jsotola

@jsotola, извини, я обновил свой пост с учетом ввода и вывода CSV. Спасибо за помощь., @Terrence

Я отредактировал вопрос, удалив слово «десятичный», которым вы здесь злоупотребили., @Edgar Bonet


1 ответ


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

1

Arduinos использует очень стандартные форматы для своих внутренних двоичных файлов. представления данных:

  • целые числа находятся в дополнении до двух
  • Поплавки соответствуют стандарту IEEE 754
  • оба имеют прямой порядок байтов.

Это то же самое, что и ваш типичный x86_64. Смысл в том, что однажды байты находятся на вашем компьютере, вам не нужно выполнять какие-либо преобразования на все. Все, что вам нужно сделать, это либо создать псевдоним, либо скопировать байты в память. местоположения переменных, которые предназначены для получения значений.

Пример на простом языке C:

uint8_t temperature_bytes[] = { 51, 51, 152, 66 };
float temperature;
memcpy(&temperature, temperature_bytes, sizeof temperature);
// теперь `temperature` имеет значение 76,1.

Как бы вы это сделали на C# — вопрос, выходящий за рамки данной статьи. сайт.

,

Хорошая точка зрения. Спасибо за руководство. Я перейду к переполнению., @Terrence