1. 程式人生 > >[轉]串列埠收發float型資料

[轉]串列埠收發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位元組的資料也一樣。