如果是格式化 ,用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字節的數據也一樣。