利用联合体通过串口收发浮点数

以下介绍两种方法,一种是利用指针,一种是利用联合体,时间宝贵的看客可以直接跳到第二种方法
这里只是讨论数据发送前和接收后的处理,不讨论具体发送过程

方法一:指针
 

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的地址就是数组首地址 ,不需要像方法一那样强转!
 
 
 
 
 

posted on 2015-12-10 21:54  simonlin  阅读(5262)  评论(0编辑  收藏  举报

导航