浮點(diǎn)轉(zhuǎn)十六進(jìn)制: /*作用:浮點(diǎn)數(shù)---轉(zhuǎn)---十六進(jìn)制 */ union fnum { long int m; float f; }; 然后需要在引用的函數(shù)內(nèi)聲明共用體比如: union fnum num; 用法:共用體是將 多個(gè)成員變量共用一個(gè)地址,并且同一時(shí)刻只允許1個(gè)成員變量被賦值,當(dāng)某個(gè)成員變量修改后,其他的成員立刻改變, 比如:num.f=6.91;那么num.m=0x40DD1EB8; 當(dāng)num.f=6.0時(shí),另一個(gè)成員變量也改變num.m=40C00000 因?yàn)?單片機(jī)的十進(jìn)制和十六進(jìn)制都可以進(jìn)行直接計(jì)算,所以用以上辦法就可以實(shí)現(xiàn)浮點(diǎn)數(shù)轉(zhuǎn)十六進(jìn)制. 通俗的講:共用體就像一個(gè)容器,成員變量就是不同形狀的容器出口,當(dāng)我們把1個(gè)圓形的物體放進(jìn)去,如果這時(shí)我們像要一個(gè)方形的物體,那么就從方形的出口將物體取出,就得到方形了, 同理,我們要浮點(diǎn)轉(zhuǎn)十六進(jìn)制,就把浮點(diǎn)放進(jìn)共用體(num.f=6.91),然后從整形取出( Rec=num.m ) 細(xì)節(jié)問題: 因?yàn)楦↑c(diǎn)數(shù)轉(zhuǎn)成十六進(jìn)制后,通常都是32位數(shù)據(jù),所以我們在取出整形數(shù)的時(shí)候要 用一個(gè)32位的變量(long int,或者u32 ) 去存. 2. 共用體和結(jié)構(gòu)體的區(qū)別 共用體和結(jié)構(gòu)體有下列區(qū)別: 1. 共用體和結(jié)構(gòu)體都是由多個(gè)不同的數(shù)據(jù)類型成員組成, 但在任何同一時(shí)刻, 共用體只存放了一個(gè)被選中的成員, 而結(jié)構(gòu)體的所有成員都存在。 2. 對于共用體的不同成員賦值, 將會(huì)對其它成員重寫, 原來成員的值就不存在了, 而對于結(jié)構(gòu)體的不同成員賦值是互不影響的。 另外要注意的是,
計(jì)算串口接收到的浮點(diǎn)數(shù): 我們通常在接收到串口的數(shù)字時(shí), 基本上都是文本類型的數(shù)字, 并且是一位一位的文本, 比如6.19就是 ‘6’, ’.’ , ’1’ , ’9’ 我們將它重新變?yōu)?.19需要進(jìn)行一下操作: Arr[]={‘6’,’.’,’1’,’9’} 1. 所有文本類型的數(shù)字只有 減零 之后才可以進(jìn)行計(jì)算,否則是文本型. Arr[0]-‘0’; 2. 特別注意
sum_num= (float)(arr[6]-'0')+ (float)(arr[8]-'0')/10 +(float)(arr[9]-'0')/ 100; 在計(jì)算的時(shí)候,小數(shù)部分要轉(zhuǎn)換成 小數(shù),然后進(jìn)行相加, 注意的是 在(float) (arr[8]-'0')/10的時(shí)候, 前面要先強(qiáng)制裝換成(float)之后 才可以/10,這樣才是把 1變成0.1, 如果在/10之前 沒有(float)的話,意味著取10的倍數(shù), 如果是 1/10,不加(float),那就等于0;最后相加就等于6.00000; 正確: 3. 注意細(xì)節(jié): 成功將Arr[]={‘6’,’.’,’1’,’9’} 組合成sum_num =6.19之后, 在進(jìn)行判斷sum_num時(shí): if(sum_num == 62.91f) { LED1=0; } 注意這里的62.91后面加f,如果不加會(huì)報(bào)警告: :單精度操作數(shù)隱式轉(zhuǎn)換為雙精度 當(dāng)if(sum_num == 62.91) { LED1=0; } 這里的sum_num是浮點(diǎn)型,而62.91默認(rèn)是雙精度類型的; 當(dāng)2個(gè)不同類型的變量 相加減時(shí),會(huì)將二者都轉(zhuǎn)換成較大一方的類型, 所以 浮點(diǎn)數(shù) 和 雙精度進(jìn)行判斷時(shí):浮點(diǎn)數(shù)會(huì)被轉(zhuǎn)換成雙精度.所以會(huì)報(bào)警告,告訴你這里進(jìn)行了這樣的操作. 當(dāng)if(sum_num == 62.91f) { LED1=0; }這里的62.91f 是將62.91轉(zhuǎn)換成浮點(diǎn)數(shù) 浮點(diǎn)數(shù) 和 浮點(diǎn)數(shù)進(jìn)行判斷 或者 計(jì)算,并不會(huì)轉(zhuǎn)換成雙精度,警告自然沒了 下面附上 我自己研發(fā)的一些筆記,也都是經(jīng)驗(yàn)
|