про получение float на матлабе от ATmega32 Avr
**** я использую ATmega32 для отправки float и хочу получить его на Matlab, я отправляю 4,85 с ATmega32, но на Matlab я получаю 4,260233679216239e-31 ... может ли кто-нибудь помочь мне ... заранее спасибо * * **
//код студии Atmel++++код для отправки float из Atmega32
union abc{ float fo; unsigned long lo; };
union abc data;
int main(void)
{ usart_init();
data.fo=4.85;
while(1) {
for(int i=0; i<=24; i+=8)
{
uart_send(data.lo>>i); }}}
//Код Matlab для получения числа с плавающей запятой
s=serial('COM1','BaudRate',9600);
fopen(s);
out=fread(s,1,'single');
fclose(s);
@mohamed, 👍1
2 ответа
Двоичное представление 4.260233679216239e-31 — 0x0d0a40a3
.
первые два байта (в формате с обратным порядком байтов) — это 0x0d
и 0x0a
, которые
это символы ASCII CR и LF. Эти символы, в
тандемные, часто используются в качестве терминаторов строк. Я предполагаю, что
uart_send()
делает не то, что вы думаете...
Я предлагаю вместо этого использовать Serial.write()
. Таким образом, у вас не будет
нежелательные терминаторы строк. И это также сделает вашу проблему актуальной
в отношении этого сайта.
Кроме того, не отправляйте байты повторно, отправляйте их только один раз по запросу. Если вы отправляете их непрерывно, Matlab может поймать последовательный поток в середине числа и собрать байты в неправильном порядке.
Я нашел решение этой проблемы, я установил заголовок перед отправкой данных с ATmega32, и на Matlab я проверяю кадр, если он получен правильно, я получаю данные
//ATmega32 code
float x =215.5;
unsigned char *ptrx;
int main(void)
{ usart_init();
//data.fo=12.85;
ptrx=( unsigned char *) &x;
while(1)
{
uart_send(0xAA);//equals to 170
for(int i=0;i<4;i++){
uart_send(*(ptrx+i));}
x++;}}
//on Matlab
s=serial('COM1','BaudRate',9600);
fopen(s);
i=1;
while i<1000
header =fread(s,1,'uint8');
if header==170//equal to 0xAA
out=fread(s,1,'float');
data(i)=out;
i=i+1;
end
end
fclose(s);
- Получение данных от сети 120В 50/60Гц
- avrdude ser_open() can't set com-state
- Float печатается только 2 десятичных знака после запятой
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Печать массива байтов на экране последовательного монитора Arduino IDE
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Arduino IDE Отказано В Разрешении На Загрузку, Ubuntu
- Нет заголовочных файлов (.h) в Documents\Arduino\libraries\arduino_144469 с демонстрационным кодом