串口發(fā)送浮點型數(shù)據(jù)及int(2個字節(jié))long int(4個字節(jié))的方法
方法一:
直接把float數(shù)據(jù)拆分為4個unsigned char(由于數(shù)字沒法拆分,所以只能用指針的),發(fā)過去,在合并為float。
其中有兩點要注意。
(1)大端存儲,小端存儲;如果搞錯讀取數(shù)據(jù)就不是你接收的數(shù)據(jù)地址(我主要使用了fpga,arm以及PC機,很有可能存儲方式不同,一般可能不需要考慮)
(2)字對齊。不然就合并不成float(我先前沒注意直接一個很怪異的數(shù)據(jù))
發(fā)送端
void package_frame(const void *data)
{
int i;
for(i=0; i<4; i++)
{
send_frame[i] = ((uchar *)data)[i];
}
}
將float data數(shù)據(jù)拆分成uchar后存儲在數(shù)組send_frame[]發(fā)送。
float exchange_data(uchar *data)
{
float float_data;
float_data = *((float*)data);
return float_data;
}
將uchar *data首地址付給float_data來合并成float型數(shù)據(jù)(記得字對齊和大小端存儲,不然數(shù)據(jù)不對)
其實發(fā)整數(shù)等大于1字節(jié)的數(shù)據(jù)也一樣。
方法二:
讀取的adc數(shù)據(jù)寄存器的值不*3.3V(或5V)除以2的N次方,直接把這個數(shù)據(jù)發(fā)到上位機,在上位機程序里再*3.3V除以2的N次方。
這樣就避免了傳遞浮點數(shù)的麻煩。