про получение 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);

, 👍1


2 ответа


0

Двоичное представление 4.260233679216239e-31 — 0x0d0a40a3. первые два байта (в формате с обратным порядком байтов) — это 0x0d и 0x0a, которые это символы ASCII CR и LF. Эти символы, в тандемные, часто используются в качестве терминаторов строк. Я предполагаю, что uart_send() делает не то, что вы думаете...

Я предлагаю вместо этого использовать Serial.write(). Таким образом, у вас не будет нежелательные терминаторы строк. И это также сделает вашу проблему актуальной в отношении этого сайта.

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

,

2

Я нашел решение этой проблемы, я установил заголовок перед отправкой данных с 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);
,