打印
[51单片机]

32位16进制浮点数转换为10进制

[复制链接]
8561|58
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guanyumou|  楼主 | 2014-11-20 12:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 guanyumou 于 2014-11-20 14:14 编辑

如题
单片机读取一个32位的16进制数,符合IEEE754国际标准的四字节形式,我要想把它转换为10进制并放大100倍后,在数码管上显示!请问怎么操作?
比如我单片机读过来的数据是16进制:43FA0000,换算后实际是10进制浮点数500.00,我想放大100倍后用于在数码管显示,浮点数这块如何处理呢?
大师能给一个参考程序吗,尤其是浮点数处理这块!

补充:数码管上还要显示一下正负符号位

相关帖子

沙发
coody| | 2014-11-20 14:10 | 只看该作者
(unsigned long)(i * 100.0)

使用特权

评论回复
板凳
guanyumou|  楼主 | 2014-11-20 14:13 | 只看该作者
coody 发表于 2014-11-20 14:10
(unsigned long)(i * 100.0)

你好,这样做恐怕不对吧?!读过来的是4个字节的IEEE754国际标准的16进制数据哦!是不是先得转换呢?

使用特权

评论回复
地板
ayb_ice| | 2014-11-20 14:26 | 只看该作者
U32 out;

out = i * 100;

U8 a = out % 10;
out /= 10;

U8 b = out % 10;
out /= 10;
...

使用特权

评论回复
5
guanyumou|  楼主 | 2014-11-20 14:46 | 只看该作者
ayb_ice 发表于 2014-11-20 14:26
U32 out;

out = i * 100;

您好,首先谢谢您的回答
这个U32 out
是定义了一个浮点数吗?
比如我单片机接收到的数据就是43FA0000这个16进制的,
然后这里定义了一个flaot型的Out变量后,把43FA0000赋值给out后,
就会自动转换为实际真实的浮点数500.00吗????求解答!

使用特权

评论回复
6
ningling_21| | 2014-11-20 14:59 | 只看该作者
本帖最后由 ningling_21 于 2014-11-20 15:03 编辑

这个U32 out
是定义了一个浮点数吗?

不是浮点数,是长整型数

直接赋值,只得到浮点数的整数部分

使用特权

评论回复
7
guanyumou|  楼主 | 2014-11-20 15:02 | 只看该作者
ayb_ice 发表于 2014-11-20 14:26
U32 out;

out = i * 100;

您好 我再补充一下,单片机通过MODBUS RTU协议接收过来的数据是类似如下:
16进制的43FA0000这样的数据,然后是符合IEEE754国际标准的四字节形式的浮点数
你给我列举的例子是不是说,把这个43FA0000直接赋给一个flaot变量,它就自动转换为实际的浮点数500.00了?然后再进行其他操作?
我是个新手,不太懂!

如果不是这个意思 那是不是还要进行划算呢?另外还有可能是负值的!
求您百忙之中解答一下!

使用特权

评论回复
8
guanyumou|  楼主 | 2014-11-20 15:05 | 只看该作者
ningling_21 发表于 2014-11-20 14:59
这个U32 out
是定义了一个浮点数吗?

举个例子吧:
我单片机接收到4个字节的数据是16进制的43FA0000
然后告诉我的是,这个数据是符合IEEE754国际标准的四字节形式的浮点数
经过手动计算,得知实际值是500.00

我最终目的是要在数码管上显示500.00

该如何操作呢?对了 实际值还有可能是负值!

使用特权

评论回复
9
ayb_ice| | 2014-11-20 15:06 | 只看该作者
guanyumou 发表于 2014-11-20 15:02
您好 我再补充一下,单片机通过MODBUS RTU协议接收过来的数据是类似如下:
16进制的43FA0000这样的数据, ...

本身是浮点数,赋值给浮点数当然还是浮点数了(但要注意大小端的问题)

正负值就简单了,判断正负后就可以对方处理了

。。。

使用特权

评论回复
10
ayb_ice| | 2014-11-20 15:06 | 只看该作者
guanyumou 发表于 2014-11-20 15:02
您好 我再补充一下,单片机通过MODBUS RTU协议接收过来的数据是类似如下:
16进制的43FA0000这样的数据, ...

本身是浮点数,赋值给浮点数当然还是浮点数了(但要注意大小端的问题)

正负值就简单了,判断正负后就可以对方处理了

。。。

使用特权

评论回复
11
ayb_ice| | 2014-11-20 15:06 | 只看该作者
guanyumou 发表于 2014-11-20 15:02
您好 我再补充一下,单片机通过MODBUS RTU协议接收过来的数据是类似如下:
16进制的43FA0000这样的数据, ...

本身是浮点数,赋值给浮点数当然还是浮点数了(但要注意大小端的问题)

正负值就简单了,判断正负后就可以对方处理了

。。。

使用特权

评论回复
12
guanyumou|  楼主 | 2014-11-20 15:15 | 只看该作者
ayb_ice 发表于 2014-11-20 15:06
本身是浮点数,赋值给浮点数当然还是浮点数了(但要注意大小端的问题)

正负值就简单了,判断正负后就可 ...

你好,这个单片机读过来的是2路16位的16进制的数据,然后组成一个32位的16进制的数!
是51单片机通过串口(MODBUS RTU协议)读过来的
比如读过来的是43FA000016进制的,是保存在两个无符号整数寄存器里的,
您的意思是把这个直接赋值给一个float变量后,它就能直接转换为实际的浮点数500.00了吗?

使用特权

评论回复
13
guanyumou|  楼主 | 2014-11-20 15:17 | 只看该作者
ayb_ice 发表于 2014-11-20 15:06
本身是浮点数,赋值给浮点数当然还是浮点数了(但要注意大小端的问题)

正负值就简单了,判断正负后就可 ...

单片机读过来的只是保存在2个16位寄存器里的无符号16进制数:43FA0000
读过来不是直接读浮点数的!
哎!我不知道您明白我的意思不,或许我表达能力不行!

使用特权

评论回复
14
ningling_21| | 2014-11-20 15:19 | 只看该作者
guanyumou 发表于 2014-11-20 15:05
举个例子吧:
我单片机接收到4个字节的数据是16进制的43FA0000
然后告诉我的是,这个数据是符合IEEE754国 ...

可以把浮点数 扩大后赋给整形数,再拆分个十百千送显示就可以了
判断正负很简单
if(x>=0)  //S正数
{
   
}
else   //负数,加负号
{

}

使用特权

评论回复
15
guanyumou|  楼主 | 2014-11-20 15:21 | 只看该作者
ningling_21 发表于 2014-11-20 15:19
可以把浮点数 扩大后赋给整形数,再拆分个十百千送显示就可以了
判断正负很简单
if(x>=0)  //S正数

您能给个例子么?简单的就成!
怎么就把32位16进制的43FA0000转换为10进制浮点数500.00
求这个转换过程!!!

使用特权

评论回复
16
ningling_21| | 2014-11-20 15:22 | 只看该作者
guanyumou 发表于 2014-11-20 15:17
单片机读过来的只是保存在2个16位寄存器里的无符号16进制数:43FA0000
读过来不是直接读浮点数的!
哎! ...

使用联合体,就可以转换浮点数了

union f_to_char
{
        float f_val;
        uchar char_val[4];
};

先把4个字节放进char_val[4]中,就得到了f_val;

使用特权

评论回复
17
guanyumou|  楼主 | 2014-11-20 15:27 | 只看该作者
ningling_21 发表于 2014-11-20 15:22
使用联合体,就可以转换浮点数了

union f_to_char

您的意思是说:
char_val[3]=0x43;
char_val[2]=0xfa;
char_val[1]=0x00;
char_val[0]=0x00;

这样操作后

f_val这个浮点型变量里保存的就是浮点数500.00???

然后把这个f_val放大100倍就可以保存到一个32位整形变量里?

使用特权

评论回复
18
ningling_21| | 2014-11-20 15:34 | 只看该作者
guanyumou 发表于 2014-11-20 15:27
您的意思是说:
char_val[3]=0x43;
char_val[2]=0xfa;

方法对,顺序反了

char_val[0]=0x43;
char_val[1]=0xfa;
char_val[2]=0x00;
char_val[3]=0x00;

使用特权

评论回复
19
guanyumou|  楼主 | 2014-11-20 15:40 | 只看该作者
ningling_21 发表于 2014-11-20 15:34
方法对,顺序反了

char_val[0]=0x43;

你好,你确认char_val[0]保存的是高16位的高8位?
char_val[3]保存的是低16位的低8位?

使用特权

评论回复
20
ningling_21| | 2014-11-20 15:55 | 只看该作者
注意大小端的问题,我是这样用的,你可以两种都试试就知道了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

86

帖子

1

粉丝