在单片机中,和上位机通讯一般是用串口。如果要发送一个数据123.4,有两种方法:
- 把123.4转化为数据串,也就是“123.4”,然后再通过串口一个字节一个字节发送。
- 把浮点型数据拆分成一个个单字符,然后通过串口发送到上位机,最后再在上位机组合,例子如下。
#include <stdio.h>
#include <string.h>
#define BYTE0(dwTemp) ( *( (char *)(&dwTemp) ) )
#define BYTE1(dwTemp) ( *( (char *)(&dwTemp) + 1) )
#define BYTE2(dwTemp) ( *( (char *)(&dwTemp) + 2) )
#define BYTE3(dwTemp) ( *( (char *)(&dwTemp) + 3) )
union Test
{
char carr[4];
float fdata;
};
int main(void)
{
union Test test;
float f=123.4f;
char *pf;
char num1[4],num2[4],num3[4],num4[4],num5[4];
int i;
float f1,f2,f3,f4,f5;
/* 浮点数拆分成多字节数据 */
//第一种方法
test.fdata = f;
for(i=0;i<4;i++)
{
num1[i] = test.carr[i];
}
//第二种方法
num2[0] = BYTE0(f);
num2[1] = BYTE1(f);
num2[2] = BYTE2(f);
num2[3] = BYTE3(f);
//第三种方法
pf=(char *)(&f);
for(i=0;i<4;i++)
{
num3[i]=*(pf+i);
}
//第四种方法
memcpy(num4,&f,sizeof(char)*4);
//第五种方法
(*((float *)num5)) = f;
for(i=0;i<4;i++)
{
printf("num1=%X\tnum2=%X\tnum3=%X\tnum4=%X\tnum5=%X\n",num1[i]&0xFF,num2[i]&0xFF,num3[i]&0xFF,num4[i]&0xFF,num5[i]&0xFF);
}
/* 多字节数据合成一个浮点数 */
//第一种方法
for(i=0;i<4;i++)
{
test.carr[i]=num1[i];
}
f1 = test.fdata;
//第二种方法
BYTE0(f2) = num2[0];
BYTE1(f2) = num2[1];
BYTE2(f2) = num2[2];
BYTE3(f2) = num2[3];
//第三种方法
pf = (char *)(&f3);
for(i=0;i<4;i++)
{
*(pf+i) = num3[i];
}
//第四种方法
memcpy(&f4,num4,sizeof(char)*4);
//第五种方法
f5 = (*((float *)num5));
printf("\nf1=%f\tf2=%f\tf3=%f\tf4=%f\tf5=%f\n",f1,f2,f3,f4,f5);
return 0;
}
/***********************************************************************************
num1=CD num2=CD num3=CD num4=CD num5=CD
num1=CC num2=CC num3=CC num4=CC num5=CC
num1=F6 num2=F6 num3=F6 num4=F6 num5=F6
num1=42 num2=42 num3=42 num4=42 num5=42
f1=123.400002 f2=123.400002 f3=123.400002 f4=123.400002 f5=123.400002
***********************************************************************************/
网友评论