博主被这个问题卡了很久,先说明一下,博主想要做成的事情,目前希望通过上位机向下位机发送指令,然后当接收到指令后,返回一个float 的类型的数据,4个bytes
上一篇博客中提到了IEEE 754 标准,然后我就希望,任何的浮点数都能够通过转换到16进制。
下面是来自另外一篇博客:https://www.eefocus.com/taotaok/blog/15-08/317468_8b031.html
///
在实现单片机与外围设备的通信时,经常需要传送一些浮点型数据,而数据传输过程中又无法直接传输浮点数据。
应用中通过C语言浮点数格式(IEEE-754标准)来进行数据转换。将待转换的的浮点数依照IEEE-754标准进行转换,利用转换后的数据进行数据传输。
如果通过普通的程序进行转换,其转换过程略显繁琐。考虑到C语言中浮点数本身就是采用IEEE格式来存储的,因此可直接利用其存储的二进制数值进行数据传输。共用体(union)可方便的实现这种功能。
1. C语言浮点数格式
在计算机中,浮点数的存储均采用4字节的IEEE-754格式。其中,位31:符号位S,位30-23:阶码E,位22-0:尾数M(22->0,从高位到低位)。所表示的浮点数值为(-1)s·(1+M·2-23)·2E-127。例如,浮点数5.0的IEEE表示为40a00000,S=0,E=129,M=221,浮点数1.2表示为:3f99999a。
2. 共用体union实现
union:使几个不同的变量共占用同一段内存的结构。
定义方式
typedef union
{
float floatData;
uint32 byteData;
}FLOAT_BYTE;
FLOAT_BYTE testData;
定义的共用体testData中,包括两个变量,浮点型变量floatData(占用4字节空间),无符号整型变量byteData(占用4字节空间),这两个变量占用的4字节空间是同一段内存单元,因此写入的数据会相互覆盖。
使用时,将浮点型数据存储到floatData中,即可通过byteData来读取其IEEE格式数据;
将IEEE格式数据存储到byteData中,即可读取floatData读取浮点数值。
3. 注意事项
虽然这种方法已经在计算机上验证,但是不同的芯片其数据存储方式可能会有不同(虽然没有尝试),在使用之前一定要进行验证。以下为几个经过验证的转换
5.0 --> 0x40a00000
60 --> 0x42700000
1.2 --> 0x3f99999a
/
但是如果你去尝试,但是,但是,你没有办法把这个得到的这个数据直接传过去的,因为他是u32类型的。
哎,博主想了很多想法,sprintf 等等各种方案,花了接近一天的时间,终于搞定了,那么解决方案是什么呢?
typedef union
{
float floatData;
unsigned char byteData[4]; //就是把这个改成什么样
}FLOAT_BYTE;
然后,我们就可以通过这个数组直接访问我们的转换的内容了。
重要提一句,我们上边的就是利用系统的内部转换进行工作的。