串口通信中整型和浮點(diǎn)型數(shù)據(jù)的處理和發(fā)送_第1頁(yè)
串口通信中整型和浮點(diǎn)型數(shù)據(jù)的處理和發(fā)送_第2頁(yè)
串口通信中整型和浮點(diǎn)型數(shù)據(jù)的處理和發(fā)送_第3頁(yè)
串口通信中整型和浮點(diǎn)型數(shù)據(jù)的處理和發(fā)送_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、串口通信中整型和浮點(diǎn)型數(shù)據(jù)的處理和發(fā)送 在做下位機(jī)通信時(shí)往往會(huì)用到串口,包括下位機(jī)將數(shù)據(jù)傳輸給上位機(jī),或者是下位機(jī)與下位機(jī)之間進(jìn)行數(shù)據(jù)傳輸,這時(shí)候就會(huì)遇到發(fā)送數(shù)據(jù)的問題,單片機(jī)通過(guò)串口 發(fā)送數(shù)據(jù)時(shí)往往是一次一個(gè)字節(jié)(8位),如果傳輸char(8位)型數(shù)據(jù)則很好辦,只需要直接發(fā)送就可以了,但是在發(fā)送int型數(shù)據(jù)和float型數(shù)據(jù)時(shí) 就會(huì)稍微有些復(fù)雜。 下面就以常用的8位單片機(jī)89c51為例來(lái)進(jìn)行說(shuō)明。 當(dāng)發(fā)送int型或long型數(shù)據(jù)時(shí)還比較簡(jiǎn)單,一個(gè)int型數(shù)據(jù)是16位,long是32位,把int型/long型數(shù)據(jù)變成2/4個(gè)char型數(shù)據(jù)發(fā)送出去就可以了,程序如下void long_char(

2、unsigned long l,unsigned char *s) *s = l24; *(s+1) = l16; *(s+2) = l8; *(s+3) = l; 在串口助手上就可以接收到相應(yīng)的long型數(shù)據(jù)了。 當(dāng)發(fā)送float型數(shù)據(jù)時(shí)稍微有些復(fù)雜。下面簡(jiǎn)單介紹下float型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)方式(double類似,以下部分參考了別人的博客)。 float遵從的是IEEE R32.24 在存儲(chǔ)中都分為三個(gè)部分:1.符號(hào)位(Sign) : 0代表正,1代表為負(fù) 2.指數(shù)位(Exponent):用于存儲(chǔ)科學(xué)計(jì)數(shù)法中的指數(shù)數(shù)據(jù),并且采用移位存儲(chǔ) 3.尾數(shù)部分(Mantissa):尾數(shù)部分 flo

3、at的存儲(chǔ)方式如下圖所示: R32.24和R64.53的存儲(chǔ)方式都是用科學(xué)計(jì)數(shù)法來(lái)存儲(chǔ)數(shù)據(jù)的,比如8.25用十進(jìn)制的科學(xué)計(jì)數(shù)法表示就為:8.25*,而120.5可以表示為:1.205* 而計(jì)算機(jī)根本不認(rèn)識(shí)十進(jìn)制的數(shù)據(jù),他只認(rèn)識(shí)0,1,所以在計(jì)算機(jī)存儲(chǔ)中,首先要將上面的數(shù)更改為二進(jìn)制的科學(xué)計(jì)數(shù)法表示,8.25用二進(jìn)制表示可表示為 1000.01,120.5用二進(jìn)制表示為:1110110.1。用二進(jìn)制的科學(xué)計(jì)數(shù)法表示1000.01可以表示為1.00001*,1110110.1可以表示為1.1101101*,任何一個(gè)數(shù)都的科學(xué)計(jì)數(shù)法表示都為1.xxx*, 尾數(shù)部分就可以表示為xxxx,第一位都是1,

4、所以可以將小數(shù)點(diǎn)前面的1省略,所以23bit的尾數(shù)部分,可以表示的精度卻變成了24bit,道理就是在 這里,那24bit能精確到小數(shù)點(diǎn)后幾位呢,我們知道9的二進(jìn)制表示為1001,所以4bit能精確十進(jìn)制中的1位小數(shù)點(diǎn),24bit就能使float能 精確到小數(shù)點(diǎn)后6位,而對(duì)于指數(shù)部分,因?yàn)橹笖?shù)可正可負(fù),8位的指數(shù)位能表示的指數(shù)范圍就應(yīng)該為:-127-128了,所以指數(shù)部分的存儲(chǔ)采用移位存儲(chǔ), 存儲(chǔ)的數(shù)據(jù)為元數(shù)據(jù) 127,下面就看看8.25和120.5在內(nèi)存中真正的存儲(chǔ)方式。 首先看下8.25,用二進(jìn)制的科學(xué)計(jì)數(shù)法表示為:1.00001*按照上面的存儲(chǔ)方式,符號(hào)位為:0,表示為正,指數(shù)位為:3 1

5、27=130 ,位數(shù)部分為,故8.25的存儲(chǔ)方式如下圖所示:而單精度浮點(diǎn)數(shù)120.5的存儲(chǔ)方式如下圖所示:根據(jù)我們的計(jì)算方式,可以計(jì)算出,這樣一組數(shù)據(jù)表示為:1.1101101*=120.5而雙精度浮點(diǎn)數(shù)的存儲(chǔ)和單精度的存儲(chǔ)大同小異,不同的是指數(shù)部分和尾數(shù)部分的位數(shù)。 介紹完了float型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)方式后能夠知道如何發(fā)送float型數(shù)據(jù)了,直接按照int型類似的發(fā)送肯定是不行的,這就需要采用指針的方法(在keil中數(shù)據(jù)的排放格式是大端模式):void float_char(float f,unsigned char *s)unsigned char *p;p = (unsigned c

6、har *)&f; *s = *p; *(s+1) = *(p+1); *(s+2) = *(p+2); *(s+3) = *(p+3); 通過(guò)這種方法把數(shù)組s發(fā)送出去,在接受端接受到的就是標(biāo)準(zhǔn)的IEEE754結(jié)構(gòu)的原始數(shù)據(jù),也就是float型數(shù)據(jù)在內(nèi)存中存放的值,如果需要得到這個(gè)float型數(shù)據(jù)的值還需要進(jìn)行一個(gè)轉(zhuǎn)換。 這種方法比較簡(jiǎn)單明了,這時(shí)候的串口接收端可以用現(xiàn)成的,不需要自己編寫。 還可以采用共用體的方法,如果采用共用體時(shí)串口的接收端軟件需要自己編寫。 我們知道共用體可以使不同的數(shù)據(jù)類型來(lái)共享相同的地址空間,所以程序如下:void float_char(float f,unsigned char *s)union change float d; unsigned char dat4; r1;r1.d = f; *s = r1.dat0; *(s+1) = r1.dat1; *(s+2) = r1.dat2; *(s+3) = r1.dat3; 接收端采用同樣的程序編寫就可以得到float型數(shù)據(jù)的值了,不再需要其他的轉(zhuǎn)換。類似的,傳輸long型或int型時(shí)也可以采用共用體的方法:void long_char(unsigned long l,unsigned char *s)union change l

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論