如何将串口获取16进制数据转换成float

怎么转换成这样?????

既然楼主是在C/C++这边提问 我就当楼主会用C了
其实只要猜到数据格式 这个很简单的
首先和楼主说明一下这个数据传输的格式
最开始是6个字节,不确定是什么,估计是数据头,也就是0x86001b0100ff这段
之后每四个字节为一组
楼主图片里面的例子
第一组0xe2faf041 对应温度,把这四个字节反向,也就是按字节顺序高地位翻转为0x41f0fae2 并且存到一个float类型的变量中,就可以打印了。至于为什么反向,这个就是大端小端的约定了,可以不用深究
示例程序 float t; *((int *)&t)=0x41f0fae2; printf("t = %f\n", t);
其它类似,同样处理,四个一组 代表一个数值 顺序就是楼主标出来的那个
最后一个字节是校验 可以不管追问

那个反转怎么弄,忘了

追答

假设存在字符数组unsigned char data[]里面
现在取温度,也就是data[6]-data[9]
*((int *)&t)=(data[9]<<24) |(data[8]<<16) |(data[7]<<8)| data[6];
这样应该就可以了 你试试
更简单的可以做个循环 连续取6组数据
大致
float result[6];
void parse(unsigned char data[], float *buffer)
{
int i;

for(i = 0; i <6; i ++)

*((int *)&buffer[i])=(data[i*4+9]<<24) |(data[i*4+8]<<16) |(data[i*4+7]<<8)| data[i*4+6];
}

调用的时候
parse(data, result);
然后依次使用result里面的6个数值就可以了
没有测试过 可能有小问题 你自己调一下

追问

老大你看一下这边需要怎么写

追答

serialPort1_DateReceived
这个函数是你用来接收数据的吧?
看现在的功能,是把接收的数据转为字符串了
把转字符串这部分功能去掉 然后按我说的转成float数组
UpdateReceive这个是显示的? 貌似是c# 不熟,不确定
不管怎样 得到float数组之后直接显示还是存起来等着其他时候用就随便你了

追问

老大说的对,是显示的!我是新手,还是不知道唉

追答

serialPort1_DateReceived在这里面把数据转成float 这个知道怎么转了吗?
至于如何显示 这个我就不懂了 毕竟没玩过C#
你这个分类错了 应该提交到c#那边去的
不过我想,传值+显示应该不难吧

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-13
举个温度的例子: union lhex{
unsigned char d[4];
float f;
}fdata;

fdata.d[0] = 0x14;
fdata.d[1] = 0x2e;
fdata.d[2] = 0xf8;
fdata.d[3] = 0x41;
printf("fdata = %f",fdata.f);
第2个回答  2013-08-13
应该看具体的数据结构吧

初看 什么都对应不上!
相似回答