单片机中利用Union联合体打印输出浮点数(小数)

方法一:指针

    UART串口有一个缺点,就是发送和接受是一个字节一个字节的接收,如果发送的浮点数那可怎么办啊?

    有人会说,那就一个字节一个字节发送啊。那么,我先定义一个double data。32位机中,一个double类型占8个字节,也就是说data需要拆分8块通过UART发送。

    现在只有一个变量,那么就声明一个指针指向这个变量吧

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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值