利用串列埠收發浮點數

2021-09-24 11:30:07 字數 1755 閱讀 4224

以下介紹兩種方法,一種是利用指標,一種是利用聯合體,時間寶貴的看客可以直接跳到第二種方法。這裡只是討論資料傳送前和接收後的處理,不討論具體傳送過程。

方法一:指標

uart串列埠有乙個缺點,就是傳送和接受是乙個位元組乙個位元組的接收,如果傳送的浮點數那可怎麼辦啊?

有人會說,那就乙個位元組乙個位元組傳送啊

那麼,我先定義乙個double data

32位機中,乙個double型別佔8個位元組,也就是說

data需要拆分8塊通過uart傳送。

how?

學習c語言的時候,你肯定讀過這句話:指標是c語言的精髓

那就用指標吧!

怎麼用?

我也不清楚,現在只有乙個變數,那麼就宣告乙個指標指向這個變數吧

double *p;

p = &data;

p會將8個位元組當成乙個整體,這樣p+1就不能指向下乙個位元組的位址了

那麼如果我將p強轉成 unsigned char *呢?

或者我們宣告乙個unsigned  char * 指向這個data

unsigned  char  *q;

q = (unsigned char *)p;

那麼串列埠傳送就用乙個for迴圈就夠了

for(i=0;i<8;i++)

接收方先用乙個陣列將資料從低位開始接收,再使用乙個double指標強行指向陣列頭就行了。

下面這段**是模擬串列埠傳送前後資料拆分組合的過程

int main()

; double *get_p;

p=&data;

q=(unsigned char*)p;

data = 2.123;

printf("data=%lf\n",data);

get_p = (double*)getdata;

printf("*get_p=%lf\n",*get_p);

printf("send data...\n");

for(i=0;i<8;i++)

printf("*get_p=%lf\n",*get_p);

return 0;

}

結果:

方法二:聯合體

方法一太繁瑣了,有沒有簡單點的辦法?

利用聯合體(共同體)有多簡單?

直接上**

利用結構體觀察浮點數

利用結構體定義位域,可以觀察浮點數內部是如何儲存的,看 includeusing namespace std struct fp int main 位域在本質上就是一種結構型別,不過其成員是按二進位分配的。關於位域的幾點說明 1 位域以二進位制位來儲存資料,可以在冒號左邊是位網域名稱,冒號右邊是位域...

浮點數 儲存

關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...

浮點數操作

float fx 49.03f int nx fx 100 printf d nx 執行上述 結果 4902。用vc6.0,2005,gcc編譯執行結果都是一樣。為什麼會這樣呢,是因為浮點數運算具有不精確性。其實編譯上面的 編譯器會有警告的。warning c4244 initializing co...