文章来源: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;
}