串列埠通訊下的int float型資料的處理和傳送

2021-08-18 07:00:11 字數 2029 閱讀 9787

在做下位機通訊時往往會用到串列埠,包括下位機將資料傳輸給上位機,或者是下位機與下位機之間進行資料傳輸,這時候就會遇到傳送資料的問題,微控制器通過串列埠傳送資料時往往是一次乙個位元組(8位),如果傳輸char(8位)型資料則很好辦,只需要直接傳送就可以了,但是在傳送int型資料和float型資料時就會稍微有些複雜。

下面就以常用的8位微控制器89c51為例來進行說明。

當傳送int型或long型資料時還比較簡單,乙個int型資料是16位,long是32位,把int型/long型資料變成2/4個char型資料傳送出去就可以了,程式如下

void long_char(unsigned long l,unsigned char *s)

在串列埠助手上就可以接收到相應的long型資料了。

當傳送float型資料時稍微有些複雜。下面簡單介紹下float型資料在記憶體中的儲存方式(double類似,以下部分參考了別人的部落格)。

float遵從的是ieee r32.24 在儲存中都分為三個部分:

1.符號位(sign) : 0代表正,1代表為負 

2.指數字(exponent):用於儲存科學計數法中的指數資料,並且採用移位儲存 

3.尾數部分(mantissa):尾數部分

float的儲存方式如下圖所示:

r32.24和r64.53的儲存方式都是用科學計數法來儲存資料的,比如8.25用十進位制的科學計數法表示就為:8.25*

而計算機根本不認識十進位制的資料,他只認識0,1,所以在計算機儲存中,首先要將上面的數更改為二進位制的科學計數法表示,8.25用二進位制表示可表示為1000.01,120.5用二進位制表示為:1110110.1。用二進位制的科學計數法表示1000.01可以表示為1.00001*

首先看下8.25,用二進位制的科學計數法表示為:1.00001*

按照上面的儲存方式,符號位為:0,表示為正,指數字為:3 127=130 ,位數部分為,故8.25的儲存方式如下圖所示:

而單精度浮點數120.5的儲存方式如下圖所示:

那麼如果給出記憶體中一段資料,並且告訴你是單精度儲存的話,你如何知道該資料的十進位制數值呢?其實就是對上面的反推過程,比如給出如下記憶體資料:0100001011101101000000000000,首先我們現將該資料分段,0 10000 0101 110 1101 0000 0000 0000 0000,在記憶體中的儲存就為下圖所示:

根據我們的計算方式,可以計算出,這樣一組資料表示為:1.1101101*

介紹完了float型資料在記憶體中的儲存方式後能夠知道如何傳送float型資料了,直接按照int型類似的傳送肯定是不行的,這就需要採用指標的方法(在keil中資料的排放格式是大端模式):

void float_char(float f,unsigned char *s)

通過這種方法把陣列s傳送出去,在接受端接受到的就是標準的ieee754結構的原始資料,也就是float型資料在記憶體中存放的值,如果需要得到這個float型資料的值還需要進行乙個轉換。

這種方法比較簡單明瞭,這時候的串列埠接收端可以用現成的,不需要自己編寫。

還可以採用共用體的方法,如果採用共用體時串列埠的接收端軟體需要自己編寫。

void float_char(float f,unsigned char *s)

r1;r1.d = f;

*s = r1.dat[0];

*(s+1) = r1.dat[1];

*(s+2) = r1.dat[2];

*(s+3) = r1.dat[3];  

}接收端採用同樣的程式編寫就可以得到float型資料的值了,不再需要其他的轉換。

類似的,傳輸long型或int型時也可以採用共用體的方法:

void long_char(unsigned long l,unsigned char *s)

r1;r1.d = l;

*s = r1.dat[0];

*(s+1) = r1.dat[1];

*(s+2) = r1.dat[2];

*(s+3) = r1.dat[3];  

}同時,還有一種記憶體操作函式/呼叫庫函式的方法,但這種方法對編譯器要求過高,在這裡就不介紹了。

串列埠通訊下的int float型資料的處理和傳送

在做下位機通訊時往往會用到串列埠,包括下位機將資料傳輸給上位機,或者是下位機與下位機之間進行資料傳輸,這時候就會遇到傳送資料的問題,微控制器通過串列埠傳送資料時往往是一次乙個位元組 8位 如果傳輸char 8位 型資料則很好辦,只需要直接傳送就可以了,但是在傳送int型資料和float型資料時就會稍...

Linux下串列埠通訊

1.開啟串列埠 與其他的關於裝置程式設計的方法一樣,在linux下,操作 控制串列埠也是通過操作起裝置檔案進行的。在linux下,串列埠的裝置檔案是 dev ttys0或 dev ttys1等。因此要讀寫串列埠,我們首先要開啟串列埠 char dev dev ttys0 串列埠1 int fd op...

linux 下串列埠通訊

include include include include include include include include include define baudrate b115200 baud rate 115200 define device dev ttyama0 define size...