利用串口收发浮点数

文章来源:https://www.cnblogs.com/simonlin/p/5037449.html

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

方法一:指针

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指针强行指向数组头就行了。
下面这段代码是模拟串口发送前后数据拆分组合的过程

int main()
{
	unsigned char i=0;
	double data;
	double *p;
	unsigned char *q;
	unsigned char getData[8] = {0,0,0,0,0,0,0,0};
	double *get_p;
	p=&data;
	q=(unsigned char*)p;
	data = 2.123;
	printf("data=%lf\n",data);
	get_p = (double*)getData;
        printf("*get_p=%lf\n",*get_p);
	printf("Send Data...\n");
	for(i=0;i<8;i++)
	{
		getData[i]=*(q+i);
	}
	printf("*get_p=%lf\n",*get_p);
	return 0;
}

结果:

方法二:联合体

方法一太繁琐了,有没有简单点的办法?

利用联合体(共同体)有多简单?

直接上代码

 

#include <stdio.h>

#define MAX_LENTH 8
union U1
{
    char s[MAX_LENTH];
    double d;
};
 
union U2
{
    char s[MAX_LENTH];
    double d;
};
 
int main()
{
    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...\n");
 
    for(i=0;i<MAX_LENTH;i++)
    {
        u2.s[i] = u1.s[i];
    }
 
    printf("u2.d = %lf\n",u2.d);
    return 0;
}

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值