1、联合体的方式实现
union { uint8_t a[4]float b} c
其中a[0]是b的最高字节。只需将待传输的浮点数直接赋值为b,利用串口传输时利用a[4]数组进行传输即可。
2、扩大移位的方式实现
比如需要通过串口将80.35这个浮点数进行传输,首先先将其扩大1000倍(其目的是为了保留数据的准确性)后赋值给a,a = 80350(其十六进制为0X0139DE)。然后:(a>>24)&(0X0011) = 00(最高位字节);(a>>16)&(0X0011) = 01(次高位字节);(a>>8)&(0X0011) = 39;a&(0X0011) = DE(最低位字节);最后将其值分别赋值给一个数组,利用串口传输出去。
3、整数求余的方式实现
比如a = 54321,a%10 = 1;a/10%10 = 2;a/100%10 = 3a/1000%10 = 4a/10000 = 5然后将其值赋值给一个数组,利用串口发送出去。
4、指针的方式实现
float a,unsigned char *b;a = 803.50;char *pchar = (char*)&a;for(i = 0i <sizeof(float)i++){*b = *pcharpchar++b++},然后只需通过串口将b指针指向的内容传输出去即可。
以上四种方法建议使用联合体和指针的方法,因为其他两种方法牵涉到浮点数小数点后保留几位小数的问题,这和放大倍数有关,数据接收方还需要进行数据重新组合和处理比较麻烦。
你要发送原始数据流 还是 格式化输出?如果是格式化 按原子说的 ,用sprintf / printf
如果发送原始内存数据流, 可按下面发送,
发送
float a = 1.23double b=3.2
SendBytes( *(u8*)&a ,sizeof(a) )
SendBytes( *(u8*)&b ,sizeof(b) )
上位机接到的 十六进制码,再按同样格式转回来。
如 分别接收到 s1[4] s2[8] 里面, 如果是float 就是4个字节
*(float*)&s1 就是 a
*(double*)&s2 就是b
如果解决了您的问题请采纳!
如果未解决请继续追问
那龟孙子胡说,不用听。//Flags
_fstrcpy((char *)buf,"SZFSET")
//Address
buf[6+0] = *(((BYTE *)&wAddress)+1)
buf[6+1] = *(((BYTE *)&wAddress)+0)
//Switch
if(bSwitch)
{
buf[6+2] = 0xAA
}
else
{
buf[6+2] = 0x0
}
//Freq
buf[6+3] = *(((BYTE *)&wFormatFreq)+1)
buf[6+4] = *(((BYTE *)&wFormatFreq)+0)
//Vol
buf[6+5] = *(((BYTE *)&nVoltage)+1)
buf[6+6] = *(((BYTE *)&nVoltage)+0)
//RiseTime
buf[6+7] = *(((BYTE *)&nRiseTime)+1)
buf[6+8] = *(((BYTE *)&nRiseTime)+0)
======》上面这些是将要发送的内容组成发送用的数组。
bSuccess = TRUE
for(int j=0j<16j++)
{
mLogMotorNet.SendData(buf[j]) =======》这是上位机循环发送数组
}
下面的是收到单片机上传的处理
BYTE byCh = mLogMotorNet.ReceiveData()
if(j==2 &&byCh!=0xAA ||j==3 &&byCh!=0x55 ||
j==0 &&byCh!=*(((BYTE *)&wAddress)+1) ||
j==1 &&byCh!=*(((BYTE *)&wAddress)+0) )
{
::KernelDelay(10)
bSuccess = FALSE
break
}
}
=================================
知道上位机是怎样发送的,那单片机也应进行相应的接收。最后是将处理好的数据送到使用的地方。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)