实际应用
在很多物联网设备中数据传输的过程有时候需要将各种数据组包然后再发送,比如某个监控设备,需要将传感器获取到的温度、湿度、气压等信息上传至服务器,这时候就需要将三个数据组合传输。在串口或是SPI传输的时候是一个一个字节传输,这时候就需要将温度转换成相对应的四个字节HEX。具体怎么实现看下面的实例。
程序例程
比如当前温度为25.89摄氏度,这是一个浮点数。用工具转换之后得到41 CF 1E B8 四个字节的hex这个就是25.89在内存中存储的内容。这个转换可以参考《IEEE-754标准与浮点数运算》 链接:IEEE-754
在我们自己写的程序中需要用到联合体,看到这篇文章的朋友对C语言有一定的基础了,那就简单介绍下联合体。联合体是两个变量共同用一块内存,因此我们就可以利用这个特性来对浮点数快速转换。
看下面一段代码:
union float_int
{
float x;
unsigned char s[4];
} floattoint;
floattoint.x=25.89;
sprintf(25.89的HEX为:"%02X %02X %02X %02X \n",floattoint.s[0],floattoint.s[1],floattoint.s[2],floattoint.s[3]);
在代码中,x与s[4]公用四个字节内存,将数值赋值给x,那么这个x自然存储在这个四字节中,通过数组读取内存中的数据。最后输出%02X是输出 HEX格式占两位,不够两位前面补零。
下面是运行的结果:
这里可以看到 HEX首尾互换,这是内存存储的格式是低位在前。
同理在转码的时候也可以通过这个结构体将HEX转换为float,非常方便。无论是double 还是其它格式都是可以转换的。
总结
这是我在编写NB-IOT模块传输协议的时候用到的数据转换,也是在工作中找到的小技巧希望可以帮到有需要的朋友。