OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6928|回复: 10

modbus数据如何计算,将17进制数转换为float类型

[复制链接]

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-6-3
在线时间
45 小时
发表于 2021-7-22 14:29:53 | 显示全部楼层 |阅读模式
5金钱
modbus发送的指令为03 03 00 02 00 02 64 29
第一个03代表传感器地址 第二个03代表查询功能 00 02 代表从第二位开始查询  00 02代表查询两位 64 29代表校验位
modbus接受的指令为03 03 04 51 EC 40 F0 39 7E
第一个03代表传感器地址 第二个03代表查询功能 04代表收到4个字节数 分别为51 EC 40 F0
这四个字节数就是我想要的数据,现在是十六进制数  请问怎么把他转化为float类型

在网上搜索
        float num = 0.0;
        unsigned char dddd[4];
        dddd[0] =0x51;
        dddd[1] = 0xEC;
        dddd[2] = 0x40;
        dddd[3] = 0xF0;
        float* ret = (float*)dddd;
        printf("float vlaue : %f\n", *ret);

结果为 -238827243563249672486603718656.000000 感觉不正确
又试
int main(void)
{
        printf("heee");
          
        float num = 0.0;
        int dddd[4];
        dddd[0] =0x51;
        dddd[1] = 0xEC;
        dddd[2] = 0x40;
        dddd[3] = 0xF0;
        float* ret = (float*)dddd;
        printf("float vlaue : %f\n", *ret);
        return 0;
}

结果为0.000000
不知道怎么办了 求大佬指明如何做

最佳答案

查看完整内容[请看2#楼]

谢谢 数值是错的 转换是对的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-6-3
在线时间
45 小时
 楼主| 发表于 2021-7-22 14:29:54 | 显示全部楼层
东方赤那 发表于 2021-7-22 14:41
12.12  的十六进制是 4141EB85   你把4141EB85 带入进去,  看算出来的值是不是12.12,  注意大小端存储.

谢谢 数值是错的   转换是对的
回复

使用道具 举报

16

主题

146

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7125
金钱
7125
注册时间
2015-1-23
在线时间
104 小时
发表于 2021-7-22 14:35:28 | 显示全部楼层
float* ret = (float*)dddd; 这个方法是对的,  问题估计出在你的大小端转换上.         
dddd[0] =0x51;
dddd[1] = 0xEC;
dddd[2] = 0x40;
dddd[3] = 0xF0;
改为
dddd[0] =0xF0;
dddd[1] = 0x40;
dddd[2] = 0xEC;
dddd[3] = 0x51;
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8465
金钱
8465
注册时间
2020-5-11
在线时间
3904 小时
发表于 2021-7-22 14:41:04 | 显示全部楼层
我是看到标题“17进制”进来的。
可先将已知的float 转为数组看一看,再转回去看是否一致。
专治疑难杂症
回复

使用道具 举报

16

主题

146

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7125
金钱
7125
注册时间
2015-1-23
在线时间
104 小时
发表于 2021-7-22 14:41:22 | 显示全部楼层
12.12  的十六进制是 4141EB85   你把4141EB85 带入进去,  看算出来的值是不是12.12,  注意大小端存储.
回复

使用道具 举报

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-6-3
在线时间
45 小时
 楼主| 发表于 2021-7-22 14:43:37 | 显示全部楼层
东方赤那 发表于 2021-7-22 14:35
float* ret = (float*)dddd; 这个方法是对的,  问题估计出在你的大小端转换上.         
dddd[0] =0x51;
...

谢谢你我试了一下
        float num = 0.0;
        unsigned char dddd[4];
        dddd[0] = 0xF0;
        dddd[1] = 0x40;
        dddd[2] = 0xEC;
        dddd[3] = 0x51;
        float* ret = (float*)dddd;
        printf("float vlaue : %f\n", *ret);

        return 0;
结果为126837719040.000000 这个数字是不是有点大呀
回复

使用道具 举报

16

主题

146

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7125
金钱
7125
注册时间
2015-1-23
在线时间
104 小时
发表于 2021-7-22 14:53:03 | 显示全部楼层
17864114986 发表于 2021-7-22 14:43
谢谢你我试了一下
        float num = 0.0;
        unsigned char dddd[4];

先确定一个浮点数的十六进制值 带进入去.
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8465
金钱
8465
注册时间
2020-5-11
在线时间
3904 小时
发表于 2021-7-22 14:57:14 | 显示全部楼层
你这看着就不太对啊,最高位是符号位,dddd[0] = 0xF0,得到的数据应是负数才对。
要不自己查一下float的存储方式,自己转换一下看看,怕是printf有问题。
假如只需两位小数,可以转为整数:
float x=1.23;
int y=x*100;
然后把y打印出来。
专治疑难杂症
回复

使用道具 举报

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-6-3
在线时间
45 小时
 楼主| 发表于 2021-7-22 15:32:27 | 显示全部楼层
东方赤那 发表于 2021-7-22 14:35
float* ret = (float*)dddd; 这个方法是对的,  问题估计出在你的大小端转换上.         
dddd[0] =0x51;
...

谢谢 数值是错的   转换是对的
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3359
金钱
3359
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-7-22 20:40:57 | 显示全部楼层
从程序设计上来尽量避免使用和传输浮点数。因为实际工程上都是有精度限制的,比如3.14159,单片机计算直接使用314159即可,最后结果可以除以100000。串口通信直接发送314159的HEX格式04 CB 2F即可。上位机收到数据后要利用同样再除以100000就行了。浮点数计算很占内存资源和时间资源,所以能够避免的尽量避免。通信双方约定好就可以了。
回复

使用道具 举报

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-6-3
在线时间
45 小时
 楼主| 发表于 2021-7-22 21:15:06 | 显示全部楼层
好 谢谢你
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 08:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表