在实现单片机与外围设备的通信时,经常需要传送一些浮点型数据,而数据传输过程中又无法直接传输浮点数据。
应用中通过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