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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、串口通信中整型和浮點型數(shù)據(jù)的處理和發(fā)送 在做下位機通信時往往會用到串口,包括下位機將數(shù)據(jù)傳輸給上位機,或者是下位機與下位機之間進行數(shù)據(jù)傳輸,這時候就會遇到發(fā)送數(shù)據(jù)的問題,單片機通過串口 發(fā)送數(shù)據(jù)時往往是一次一個字節(jié)(8位),如果傳輸char(8位)型數(shù)據(jù)則很好辦,只需要直接發(fā)送就可以了,但是在發(fā)送int型數(shù)據(jù)和float型數(shù)據(jù)時 就會稍微有些復雜。 下面就以常用的8位單片機89c51為例來進行說明。 當發(fā)送int型或long型數(shù)據(jù)時還比較簡單,一個int型數(shù)據(jù)是16位,long是32位,把int型/long型數(shù)據(jù)變成2/4個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; 在串口助手上就可以接收到相應的long型數(shù)據(jù)了。 當發(fā)送float型數(shù)據(jù)時稍微有些復雜。下面簡單介紹下float型數(shù)據(jù)在內(nèi)存中的存儲方式(double類似,以下部分參考了別人的博客)。 float遵從的是IEEE R32.24 在存儲中都分為三個部分:1.符號位(Sign) : 0代表正,1代表為負 2.指數(shù)位(Exponent):用于存儲科學計數(shù)法中的指數(shù)數(shù)據(jù),并且采用移位存儲 3.尾數(shù)部分(Mantissa):尾數(shù)部分 flo

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

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

5、27=130 ,位數(shù)部分為,故8.25的存儲方式如下圖所示:而單精度浮點數(shù)120.5的存儲方式如下圖所示:根據(jù)我們的計算方式,可以計算出,這樣一組數(shù)據(jù)表示為:1.1101101*=120.5而雙精度浮點數(shù)的存儲和單精度的存儲大同小異,不同的是指數(shù)部分和尾數(shù)部分的位數(shù)。 介紹完了float型數(shù)據(jù)在內(nèi)存中的存儲方式后能夠知道如何發(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); 通過這種方法把數(shù)組s發(fā)送出去,在接受端接受到的就是標準的IEEE754結(jié)構(gòu)的原始數(shù)據(jù),也就是float型數(shù)據(jù)在內(nèi)存中存放的值,如果需要得到這個float型數(shù)據(jù)的值還需要進行一個轉(zhuǎn)換。 這種方法比較簡單明了,這時候的串口接收端可以用現(xiàn)成的,不需要自己編寫。 還可以采用共用體的方法,如果采用共用體時串口的接收端軟件需要自己編寫。 我們知道共用體可以使不同的數(shù)據(jù)類型來共享相同的地址空間,所以程序如下: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型時也可以采用共用體的方法:void long_char(unsigned long l,unsigned char *s)union change l

溫馨提示

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

最新文檔

評論

0/150

提交評論