stm32 中到底 如何对浮点数转换成IEEE 754 标准存储的16进制数

博主被这个问题卡了很久,先说明一下,博主想要做成的事情,目前希望通过上位机向下位机发送指令,然后当接收到指令后,返回一个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;

 

然后,我们就可以通过这个数组直接访问我们的转换的内容了。

 

 

重要提一句,我们上边的就是利用系统的内部转换进行工作的。

 

 

 

 

 

 

 

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有水杯和雨伞的工科男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值