发新帖我要提问
123
返回列表
打印
[51单片机]

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

[复制链接]
楼主: guanyumou
手机看帖
扫描二维码
随时随地手机跟帖
41
guanyumou|  楼主 | 2014-11-21 14:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
本帖最后由 guanyumou 于 2014-11-21 14:59 编辑
coody 发表于 2014-11-21 10:47
十几年来在工控上MODBUS-RTU协议,我一直使用这个方法处理浮点数显示,简单可靠快捷,你都没测试过,凭什 ...


您息怒!再麻烦一次
比如说我接收过来的数据16进制32位的43FA0000,
我把这个数据如果赋值给单片机一个float变量的话,是不是就是浮点数500.00呢?
那如果我把这个数赋值给一个无符号32位整数的话,是不是就是整数10进制的1140457472呢?
我的编译环境是Keil 4,是51单片机!

比如:
float x;
unsigned long y,z;
/*假设z保存的是我单片机接收过来的数据16进制32位的43FA0000,此数据符合IEEE574浮点数标准*/
/*那么执行如下操作后*/
x=z;
y=z;
//x是不是就自动为浮点数500.00?
//y是不是就是10进制1140457472
=============================
求您了!

使用特权

评论回复
42
coody| | 2014-11-21 15:12 | 只看该作者
这么简单的问题都想得那么复杂,唉。。。

float   ff;
u32     dis;

void main(void)
{
    (u32)ff = 0x43fa0000;    //把0x43FA0000按十六进制装入ff,ff就是500.000了。
    dis= (u32)(ff * 100.0);   //ff * 100,在转成十六进制给dis,dis == 0xc350,就是 50000。

   while(1)   {  }
}

我打字的时间比验证上面的程序还多。。。。

使用特权

评论回复
43
guanyumou|  楼主 | 2014-11-21 15:21 | 只看该作者
coody 发表于 2014-11-21 15:12
这么简单的问题都想得那么复杂,唉。。。

float   ff;

这么简单的问题都想得那么复杂,唉。。。

float   ff;
u32     dis;

void main(void)
{
    (u32)ff = 0x43fa0000;    //把0x43FA0000按十六进制装入ff,ff就是500.000了。
    dis= (u32)(ff * 100.0);   //ff * 100,在转成十六进制给dis,dis == 0xc350,就是 50000。

   while(1)   {  }
}

我打字的时间比验证上面的程序还多。。。。


=============================================
(u32)ff=0x43fa0000;
这个似乎不要前面的强制转换(u32)
必须要吗????
你定义的ff是一个float数么?

使用特权

评论回复
44
coody| | 2014-11-21 15:39 | 只看该作者
既然有这个疑问,你为什么不试一下啊? 去掉(u32),软仿看结果就知道啦。
告诉你,去掉(u32)肯定不对!!!

float   ff;  这样定义你认为不是一个float数么?

使用特权

评论回复
45
guanyumou|  楼主 | 2014-11-21 15:44 | 只看该作者
coody 发表于 2014-11-21 15:39
既然有这个疑问,你为什么不试一下啊? 去掉(u32),软仿看结果就知道啦。
告诉你,去掉(u32)肯定不对!!! ...

您息怒!我是一个搞PLC的,现在有个项目,没办法用单片机,不懂的地方实在太多了

那么u32 dis;
这个定义了一个无符号长整形的变量么?
为什么
(u32)ff=0x43fa0000
取掉这个(u32)就不行呢?
求解释!

使用特权

评论回复
46
ayb_ice| | 2014-11-21 17:02 | 只看该作者
我发现LZ有点懒

多看反汇编就什么都明白了

使用特权

评论回复
47
ayb_ice| | 2014-11-21 17:07 | 只看该作者
还有个最简单的方法

typedef float F32;
typedef unsigned char U8;
typedef unsigned int U16;
typedef unsigned long U32

typedef signed char S8;
typedef signed int S16;
typedef signed long S32

typedef union{
        F32 f32;
        U32 u32;
        U16 u16[2];
        U8  u8[4];
        S32 s32;
        S16 s16[2];
        S8  s8[4];
}t_FLOAT;

t_FLOAT        test_float;

        test_float.f32 = 500.0;

        然后查看联合的各个变量的值

使用特权

评论回复
48
as564335sa| | 2014-11-21 21:39 | 只看该作者
modbus发过来的数据肯定是四个字节数据,可以建立一个数组char temp[4];这四个字节数据按照你所读的设备的说明排序(32位数4个字节,1234代表高低顺序)可能是1234,4321,3412等,结合单片机大小端模式排成1234或者4321,存到temp里,然后float shuju;  memcpy(&shuju,temp,4);

使用特权

评论回复
49
as564335sa| | 2014-11-21 21:41 | 只看该作者
或者shuju=*(float*)temp;shuju就是实际浮点数,乘100再取各个位就行了

使用特权

评论回复
50
guanyumou|  楼主 | 2014-11-24 09:24 | 只看该作者
as564335sa 发表于 2014-11-21 21:41
或者shuju=*(float*)temp;shuju就是实际浮点数,乘100再取各个位就行了

或者shuju=*(float*)temp;shuju就是实际浮点数,乘100再取各个位就行了
===============================================================
请问表达式在红*号是什么意思啊????

使用特权

评论回复
51
coody| | 2014-11-24 09:51 | 只看该作者
as564335sa 发表于 2014-11-21 21:41
或者shuju=*(float*)temp;shuju就是实际浮点数,乘100再取各个位就行了

验证了,不可行

使用特权

评论回复
52
as564335sa| | 2014-11-24 12:03 | 只看该作者
guanyumou 发表于 2014-11-24 09:24
或者shuju=*(float*)temp;shuju就是实际浮点数,乘100再取各个位就行了
============================ ...

temp是数组首地址char型,(float*)强制转换成float型指针,前面加个*是取这个地址的值,那么float的值就是整个数组的值了,好好看看指针

使用特权

评论回复
53
as564335sa| | 2014-11-24 12:08 | 只看该作者
coody 发表于 2014-11-24 09:51
验证了,不可行

不知道怎么不可行,我的程序里就这么用, Instant装float的四个字节数据,排序后粘到float型的Instant_Fluxf里,下面取小数跟你要的一样

使用特权

评论回复
54
coody| | 2014-11-24 13:26 | 只看该作者
as564335sa 发表于 2014-11-21 21:41
或者shuju=*(float*)temp;shuju就是实际浮点数,乘100再取各个位就行了

我的验证:
float shuju;
u32  temp;
temp = 0x43FA0000;
shuju = *(float*)temp;

运行后,shuju的值是:9.717633e-038

使用特权

评论回复
55
as564335sa| | 2014-11-24 15:12 | 只看该作者
coody 发表于 2014-11-24 13:26
我的验证:
float shuju;
u32  temp;

char temp[4];temp[0]=0x43;temp[1]=0xfa;temp[2]=0x00;temp[3]=0x00;顺序自己排

使用特权

评论回复
56
guanyumou|  楼主 | 2014-11-24 16:12 | 只看该作者
as564335sa 发表于 2014-11-24 15:12
char temp[4];temp[0]=0x43;temp[1]=0xfa;temp[2]=0x00;temp[3]=0x00;顺序自己排

你定义了一个char temp[4];
应该是uchar吧,无符号型的数组吧!
因为接收过来的数据最高位有可能是1的!

不知道我理解的对吗?

使用特权

评论回复
57
guanyumou|  楼主 | 2014-11-24 16:16 | 只看该作者
typedef float F32;
typedef unsigned char U8;
typedef unsigned int U16;
typedef unsigned long U32

typedef signed char S8;
typedef signed int S16;
typedef signed long S32

F32 shujv;
U32 temp[4];

temp[0]=0x43;
temp[1]=0xfa;
temp[2]=0x00;
temp[3]=0x00;
shuju = *(float*)temp;
这样shujv里就是实际值500.00吗?

使用特权

评论回复
58
as564335sa| | 2014-11-24 18:56 | 只看该作者
guanyumou 发表于 2014-11-24 16:12
你定义了一个char temp[4];
应该是uchar吧,无符号型的数组吧!
因为接收过来的数据最高位有可能是1的!

temp只是存个字节数据,有无符号都可以存,只要你不用这个字节去运算不改变这个值怎么存都行,只要那四个地址空间有数用float指针读出来就是正确的

使用特权

评论回复
59
as564335sa| | 2014-11-24 18:59 | 只看该作者
guanyumou 发表于 2014-11-24 16:12
你定义了一个char temp[4];
应该是uchar吧,无符号型的数组吧!
因为接收过来的数据最高位有可能是1的!

其实你21楼说那个用联合类型的跟这个一个道理,那样比这样可以省一个float的空间

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
guanyumou + 4
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则