以下介紹兩種方法,一種是利用指針,一種是利用聯合體,時間寶貴的看客可以直接跳到第二種方法
這里只是討論數據發送前和接收后的處理,不討論具體發送過程
方法一:指針
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++) { send(*(q+i)); }
接收方先用一個數組將數據從低位開始接收
再使用一個double指針強行指向數組頭就行了
下面這段代碼是模擬串口發送前后數據拆分組合的過程
vs2010
方法二:聯合體
方法一太繁瑣了
有沒有簡單點的辦法?
有
利用聯合體(共同體)有多簡單?
直接上代碼
#include "stdafx.h" #define MAX_LENTH 8 union U1 { char s[MAX_LENTH]; double d; }; union U2 { char s[MAX_LENTH]; double d; }; int _tmain(int argc, _TCHAR* argv[]) { U1 u1; U2 u2; int i=0; u1.d = 2.111; u2.d = 3.00; printf("u1.d = %lf\n",u1.d); printf("u2.d = %lf\n",u2.d); printf("Send Data..."); for(i=0;i<MAX_LENTH;i++) { u2.s[i] = u1.s[i]; } printf("u2.d = %lf\n",u2.d); while(getchar()=='q'); return 0; }
方法一簡直就是浪費腦力啊!
vs2010結果
為什么聯合體會這么神奇呢?
因為它的所有成員相對於基地址的偏移量都為0
也就是說
雙精度浮點數地址 &u1.d 與數組首地址 u1.s是一樣的
“馬后炮”:
其實方法一的方法和聯合體的思想是一樣的
利用了數組保存接收的數據(數據的實質就是內存存儲二進制),將一個指向double的指針指向這份數組的首地址,那么我們通過取值符號*將這份數據完好無缺的讀出來了啊!只不過聯合體中double的地址就是數組首地址 ,不需要像方法一那樣強轉!