|
有位小伙伴問,怎么把float類型的變量發(fā)送到串口調(diào)試助手?在這里給大家統(tǒng)一說一下。
什么時(shí)候用float類型的變量?
單片機(jī)計(jì)算數(shù)據(jù),當(dāng)用到小數(shù)的時(shí)候,我們一般就定義一個(gè)float類型的變量。
float類型占用幾個(gè)字節(jié)?
我們知道,char占用1個(gè)字節(jié),int占用2個(gè)字節(jié)。那么float類型的變量占用幾個(gè)字節(jié)呢?答案是4個(gè)。
float類型變量存儲(chǔ)遵循IEEE 754標(biāo)準(zhǔn),關(guān)于IEEE754標(biāo)準(zhǔn),你可以去百度,不過你看了也會(huì)頭大,不一定能看懂?炊床欢,都不重要了。
那么,比如,3.141這個(gè)數(shù)在單片機(jī)中存儲(chǔ)的4個(gè)字節(jié)分別是多少呢?
你可以借助一個(gè)軟件(浮點(diǎn)數(shù)十六進(jìn)制轉(zhuǎn)換器)來看,
如下所示:
浮點(diǎn)數(shù):30141
十六進(jìn)制:單精度float:40490625
如果你不想用這個(gè)軟件,可以把4個(gè)字節(jié)發(fā)送到串口調(diào)試助手來看。不過,float類型的變量是不能進(jìn)行位移運(yùn)算的。所以,假如你定義了一個(gè)x變量,當(dāng)你寫語句UART_Send(xxx>>24);UART_Send(xxx>>16);UART_Send(xxx>>8);UART_Send(xxx);的時(shí)候,編譯器會(huì)報(bào)錯(cuò)。而當(dāng)你用int把float強(qiáng)制轉(zhuǎn)換后,就會(huì)只剩下整數(shù)部分,實(shí)際上,4個(gè)字節(jié)的內(nèi)容已經(jīng)改變。
正確方法:
用c語言關(guān)鍵字union來解決。
union xxx
{
char c[4];
float f;
}y;
定義一個(gè)“共用體”xxx,y作為“共用體變量”,里面再定義一個(gè)char類型的變量數(shù)組c[4]和float類型的變量f。
根據(jù)union的定義,里面的變量占用同一個(gè)內(nèi)存地址。所以,c[4]和f的內(nèi)存地址是一樣的,說的再通俗一點(diǎn),就是c[4]的4個(gè)數(shù)實(shí)際上就是f的四個(gè)字節(jié)。
接著前面提出的問題。把3.141給了f,即f=3.141,那么,你就可以把c[4]數(shù)組的4個(gè)字節(jié)發(fā)送到串口調(diào)試助手了。
y.f=3.141;
UART_Send(y.c[0]);
UART_Send(y.c[1]);
UART_Send(y.c[2]);
UART_Send(y.c[3]);
|
評(píng)分
-
查看全部評(píng)分
|