реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Передать float из МК в Visual Studio, как собрать float обратно?
smk
сообщение Feb 27 2018, 09:40
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Здравствуйте!
В контроллере (STM32F407) раскладываю float в массив:
Код
void float_to_buf_tx (float data)
{
    tempBuf[3]= ((unsigned char*)&(data))[3];
    tempBuf[2]= ((unsigned char*)&(data))[2];
    tempBuf[1]= ((unsigned char*)&(data))[1];
    tempBuf[0]= ((unsigned char*)&(data))[0];
}

Далее массив отправляется в приложение, изготовленное с помошью Visual Studio 2010.
Пытаю собрать float обратно:
Код
temp = Convert.ToSingle((mydata[3] << 24) + (mydata[2] << 16) + (mydata[1] << 8) + mydata[0]);
            label55.Text = Convert.ToString(temp);

В итоге получается не то число, что должно быть. Понятно что что-то делаю неправильно. Вот хочу спросить как правильно? Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
_pv
сообщение Feb 27 2018, 10:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



точно так же как и отправляли,
float a;
((unsigned char *)&a)[0] = mydata[0];
((unsigned char *)&a)[1] = mydata[1];
((unsigned char *)&a)[2] = mydata[2];
((unsigned char *)&a)[3] = mydata[3];

ну или даже memcpy(&a, mydata, 4);

но вообще для этого есть union.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 27 2018, 10:41
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Используйте union


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Flexz
сообщение Feb 27 2018, 10:47
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Судя по приведенному куску кода это C#, тогда
BitConverter.ToSingle(mydata, 0);
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 27 2018, 16:43
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(_pv @ Feb 27 2018, 12:40) *
точно так же как и отправляли,
float a;
((unsigned char *)&a)[0] = mydata[0];
((unsigned char *)&a)[1] = mydata[1];
((unsigned char *)&a)[2] = mydata[2];
((unsigned char *)&a)[3] = mydata[3];

ну или даже memcpy(&a, mydata, 4);

но вообще для этого есть union.

На это ругается, что небезопасный код.


Цитата(Flexz @ Feb 27 2018, 12:47) *
Судя по приведенному куску кода это C#, тогда
BitConverter.ToSingle(mydata, 0);

Спасибо! Это работает!


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Unfog
сообщение Mar 1 2018, 06:26
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 20-05-12
Из: Санкт-Петербург
Пользователь №: 71 932



del

Сообщение отредактировал Unfog - Mar 1 2018, 14:42
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Mar 1 2018, 13:49
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(Unfog @ Mar 1 2018, 10:26) *
А не то число у вас получалось из-за неверного порядка байт:
tempBuf[3]= ((unsigned char*)&(data))[3]; - это младший байт, а в Convert вы передавали как старший.
Google => little-endian

К Вашему сведению: в формате Little-Endian младший байт располагается по младшему адресу, старшее - по старшему.
Go to the top of the page
 
+Quote Post
Unfog
сообщение Mar 1 2018, 14:42
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 20-05-12
Из: Санкт-Петербург
Пользователь №: 71 932



Да, прошу прощения, у меня ошибка.
Не обратил внимание, что индексы в tempBuf указаны с 3 по 0.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 11:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016