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