[轉]串口收發float型數據


如果是格式化 ,用sprintf / printf; 

如果發送原始內存數據流, 可按下面發送, 

發送  
float a = 1.23; double b=3.2; 
SendBytes( *(u8*)&a ,sizeof(a) );  
SendBytes( *(u8*)&b ,sizeof(b) );  

上位機接到的 十六進制碼,再按同樣格式轉回來。
 如 分別接收到  s1[4] s2[8] 里面, 如果是float 就是4個字節
*(float*)&s1 就是 a
*(double*)&s2 就是b

 

其中遇到一個頭疼的問題是傳輸的都是浮點型數,但發送接受的是unsigned char型。

float,占4字節,包括符號位(1位,第31位),指數為(8位,-126~128,22~30位),尾數位(23位,0~22位)

 

兩種方案

(1)其實精度要求不高的話,直接把浮點數X100轉化成16位或32位整數,在拆分為unsigned char類型發過去,在接收后合並,並強制轉化為float在除以100.(不太好放棄)

(2)直接把float數據拆分為4個unsigned char,發過去,在合並為float。

我使用方案(2),其中有兩點要注意。

(1)大端存儲,小段存儲;如果搞錯讀取數據就不是你接收的數據地址(我主要使用了fpga,arm以及PC機,很有可能存儲方式不同,一般可能不需要考慮)

(2)字對齊。不然就合並不成float(我先前沒注意直接一個很怪異的數據)

發送端:

void package_frame(const void *data)
{
    int i;
    for(i=0; i<4; i++)
    {
        send_frame[i] = ((uchar *)data)[i];
    }
}

接收端:

float exchange_data(uchar *data)
{
 
    float float_data;
    float_data = *((float*)data);
    return float_data;
}

 

將uchar *data首地址付給float_data來合並成float型數據(記得字對齊和大小端存儲,不然數據不對)

其實發整數等大於1字節的數據也一樣。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM