[轉]串列埠收發float型資料
阿新 • • 發佈:2018-12-17
如果是格式化 ,用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位元組的資料也一樣。