Я пытаюсь отправить python float через UART на встроенный процессор c, MKE14 от NXP. В python я использую библиотеку Struct для создания 32-битного числа с плавающей запятой и отправки его через UART. Я проверил обе имплементации поплавка и там оба "IEEE-754".
Я отправляю десятичное: 5.490715 Hex: 0x40, 0xAF, 0xB3, 0xF0
Я получаю в "Долготе" Десятичное: 1085256688 Шестнадцатеричное: 0x40, 0xAF, 0xB3, 0xF0
После переворота с плавающей запятой Десятичное: 1085256704 Шестнадцатеричное: 0x40, 0xAF, 0xB4, 0x00
Должно быть какая-то проблема с преобразованием, я получаю правильный пакет, но представление совершенно другое.
Используемый код в обеих системах находится в прикрепленном файле.
Первое предложение: возьмите пару ссылочных номеров (2.0; 3.14159; 1000000) и проверьте их шестнадцатеричное представление с обеих сторон. Я имею в виду: независимо от линии передачи. Во многих случаях возникает простая проблема порядка байтов, и все, что вам нужно сделать, это изменить порядок байтов (или битов).
Да, скорее всего, проблема с порядком байтов.






Вы не можете преобразовать целочисленный битовый шаблон в float с помощью приведения. Это просто преобразует целое число в ближайшее число с плавающей запятой, а нет повторно интерпретирует биты как float. Если это сработало так, как вы думаете, это:
const float x = 512;
установил бы x на 7.175E-43, что было бы не очень удобно.
Лучше всего просто скопировать биты, поэтому замените
SUS_Data.Longitude = ((float)Longitude);
от:
memcpy(&SUS_Data.Longitude, &Longitude, sizeof SUS_Data.Longitude);
Получите указатель и приведите тип к указателю с плавающей запятой:
uint32 tmp = 1085256688;
float f;
f = *((float *) &tmp); // 5.490715
или используйте союз:
union test {
uint32_t u;
float f;
};
union test tmp;
tmp.u = 1085256688; // tmp.f == 5.490715
в твоем случае:
SUS_Data.Longitude = *((float *) &Longitude);
Пожалуйста, без скриншотов с текстом. Просто скопируйте и вставьте!