Как восстановить числовые данные, отправленные 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
*/
}
@Terrence, 👍-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
- Использование YS-IRTM с Arduino Uno
- Онлайн-проблема подключения Arduino к базе данных MySQL
- код для автоматической двери
- Как устранить сообщение об ошибке "assignment of function 'void digitalWrite (uint8_t, uint_8)"?
- Как преобразовать char[12] в byte[6]
- Как преобразовать значения RGB в интенсивность
- Разобрать mac-строку char* в массив uint8_t
- Как считать показания датчика звука и включить датчик с датчиком воды, если показания выше порогового значения и при обнаружении воды в течение 2 минут?
каковы полученные данные полезной нагрузки в шестнадцатеричном формате?, @jsotola
https://stackoverflow.com/questions/26310249/converting-4-raw-bytes-into-32-bit-floating-point, @jsotola
@jsotola, извини, я обновил свой пост с учетом ввода и вывода CSV. Спасибо за помощь., @Terrence
Я отредактировал вопрос, удалив слово «десятичный», которым вы здесь злоупотребили., @Edgar Bonet