利用聯合體通過串口收發浮點數


以下介紹兩種方法,一種是利用指針,一種是利用聯合體,時間寶貴的看客可以直接跳到第二種方法
這里只是討論數據發送前和接收后的處理,不討論具體發送過程

方法一:指針
 

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的地址就是數組首地址 ,不需要像方法一那樣強轉!
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM