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