smk 0 27 февраля, 2018 Опубликовано 27 февраля, 2018 · Жалоба Здравствуйте! В контроллере (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); В итоге получается не то число, что должно быть. Понятно что что-то делаю неправильно. Вот хочу спросить как правильно? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 27 февраля, 2018 Опубликовано 27 февраля, 2018 · Жалоба точно так же как и отправляли, 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 27 февраля, 2018 Опубликовано 27 февраля, 2018 · Жалоба Используйте union Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 27 февраля, 2018 Опубликовано 27 февраля, 2018 · Жалоба Судя по приведенному куску кода это C#, тогда BitConverter.ToSingle(mydata, 0); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 27 февраля, 2018 Опубликовано 27 февраля, 2018 · Жалоба точно так же как и отправляли, 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); Спасибо! Это работает! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Unfog 0 1 марта, 2018 Опубликовано 1 марта, 2018 (изменено) · Жалоба del Изменено 1 марта, 2018 пользователем Unfog Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 1 марта, 2018 Опубликовано 1 марта, 2018 · Жалоба А не то число у вас получалось из-за неверного порядка байт: tempBuf[3]= ((unsigned char*)&(data))[3]; - это младший байт, а в Convert вы передавали как старший. Google => little-endian К Вашему сведению: в формате Little-Endian младший байт располагается по младшему адресу, старшее - по старшему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Unfog 0 1 марта, 2018 Опубликовано 1 марта, 2018 · Жалоба Да, прошу прощения, у меня ошибка. Не обратил внимание, что индексы в tempBuf указаны с 3 по 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться