Перейти к содержанию
    

Передать float из МК в Visual Studio

Здравствуйте!

В контроллере (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);

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

точно так же как и отправляли,

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по приведенному куску кода это C#, тогда

BitConverter.ToSingle(mydata, 0);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

точно так же как и отправляли,

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.

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

 

 

Судя по приведенному куску кода это C#, тогда

BitConverter.ToSingle(mydata, 0);

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А не то число у вас получалось из-за неверного порядка байт:

tempBuf[3]= ((unsigned char*)&(data))[3]; - это младший байт, а в Convert вы передавали как старший.

Google => little-endian

К Вашему сведению: в формате Little-Endian младший байт располагается по младшему адресу, старшее - по старшему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, прошу прощения, у меня ошибка.

Не обратил внимание, что индексы в tempBuf указаны с 3 по 0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...