Float на встроенный c float через UART

Я пытаюсь отправить 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

Должно быть какая-то проблема с преобразованием, я получаю правильный пакет, но представление совершенно другое.

Используемый код в обеих системах находится в прикрепленном файле.

Изображение кода Python

Встроенный код C

Пожалуйста, без скриншотов с текстом. Просто скопируйте и вставьте!

nicoco 04.07.2018 15:52
Почему бы не загрузить изображения кода на SO, когда задаете вопрос?
martineau 04.07.2018 16:05

Первое предложение: возьмите пару ссылочных номеров (2.0; 3.14159; 1000000) и проверьте их шестнадцатеричное представление с обеих сторон. Я имею в виду: независимо от линии передачи. Во многих случаях возникает простая проблема порядка байтов, и все, что вам нужно сделать, это изменить порядок байтов (или битов).

d-stroyer 04.07.2018 16:13

Да, скорее всего, проблема с порядком байтов.

Christian Gibbons 04.07.2018 16:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
4
216
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не можете преобразовать целочисленный битовый шаблон в 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);

Другие вопросы по теме