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