单片机学习小组
直播中

凤毛麟角

8年用户 906经验值
私信 关注

有什么方法能够实现UART串口打印浮点数呢

如何利用指针去实现UART串口打印浮点数呢?
如何利用联合体(共同体)去实现UART串口打印浮点数呢?

回帖(1)

汪佳丽

2022-1-19 11:06:23
方法一:指针
    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 = %lfn",u1.d);
    printf("u2.d = %lfn",u2.d);
    printf("Send Data...");

    for(i=0;i     {
        u2.s = u1.s;
    }

    printf("u2.d = %lfn",u2.d);
    while(getchar()=='q');
    return 0;
}


方法一简直就是浪费脑力啊!
vs2010结果


    为什么联合体会这么神奇呢?
    因为它的所有成员相对于基地址的偏移量都为0
    也就是说
    双精度浮点数地址 &u1.d 与数组首地址 u1.s是一样的

   其实方法一的方法和联合体的思想是一样的,利用了数组保存接收的数据(数据的实质就是内存存储二进制),将一个指向double的指针指向这份数组的首地址,那么我们通过取值符号*将这份数据完好无缺的读出来了啊!只不过联合体中double的地址就是数组首地址 ,不需要像方法一那样强转!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分