OpenEdv-开源电子网

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

关于modbus 03命令数据转换

[复制链接]

5

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-5-25
在线时间
86 小时
发表于 2017-5-10 17:22:00 | 显示全部楼层 |阅读模式
1金钱
各位大虾,我想问下modbus 03命令的数据是16进制,我想转换成10进制的浮点数应该怎么做!除了利用IEEE754的方法 还有什么好方法没?





1.JPG

最佳答案

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

union a { uchar f[4]; float ff; }; float value; /* a.f[0] = rxbuf[5];//这里要注意发送方是大端模式还是小端模式,如果有误,就换一下试试, a.f[1] = rxbuf[6]; a.f[2] = rxbuf[3]; a.f[3] = rxbuf[4]; */ a.f[0] = rxbuf[3];//这里要注意发送方是大端模式还是小端模式,如果有误,就换一下试试, a.f[1] = rxbuf[4]; a.f[2] = rxbuf[5]; a.f[3] = rxbuf[6]; value = a.ff;//这就是你要的浮点 ...
笑着熬下去@_@
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-5-10 17:22:01 | 显示全部楼层
union a
{
    uchar f[4];
    float ff;
};

float value;

/*
a.f[0] = rxbuf[5];//这里要注意发送方是大端模式还是小端模式,如果有误,就换一下试试,
a.f[1] = rxbuf[6];
a.f[2] = rxbuf[3];
a.f[3] = rxbuf[4];
*/
a.f[0] = rxbuf[3];//这里要注意发送方是大端模式还是小端模式,如果有误,就换一下试试,
a.f[1] = rxbuf[4];
a.f[2] = rxbuf[5];
a.f[3] = rxbuf[6];

value = a.ff;//这就是你要的浮点数,
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-5-10 18:03:01 | 显示全部楼层
你要了解浮点数存储十六进制的表示方法了,或者自己定义一种方式,比如:第一个byte是整数位,第二个byte是小数位,这样拼接起来就是浮点数了
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
发表于 2017-5-10 19:44:09 | 显示全部楼层
我原来的触摸屏都是放大100倍变成整数
电子人生!
回复

使用道具 举报

5

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-5-25
在线时间
86 小时
 楼主| 发表于 2017-5-11 08:51:38 | 显示全部楼层
enan 发表于 2017-5-10 20:57
union a
{
    uchar f[4];

可以加下QQ说吗
笑着熬下去@_@
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13114
金钱
13114
注册时间
2012-11-26
在线时间
3812 小时
发表于 2017-5-11 09:13:48 | 显示全部楼层
4楼正解   
回复

使用道具 举报

5

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-5-25
在线时间
86 小时
 楼主| 发表于 2017-5-11 10:44:06 | 显示全部楼层
enan 发表于 2017-5-10 17:22
union a
{
    uchar f[4];

typedef union     
{
    float fdata;
    unsigned char BUF[4];
}CharToFloat;


void Comvert_Value(unsigned char *rxbuf)
{   
    CharToFloat d;
    float CombineData;
    d.BUF[0]=rxbuf[6];  //D¡¶ËÄ£ê½
    d.BUF[1]=rxbuf[5];
    d.BUF[2]=rxbuf[4];
    d.BUF[3]=rxbuf[3];

    CombineData=d.fdata;
}
我这样对吗
笑着熬下去@_@
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-5-11 12:31:29 | 显示全部楼层
jeff_梁 发表于 2017-5-11 10:44
typedef union     
{
    float fdata;

没问题,
d.BUF[0]=rxbuf[6];  //这一段要你自己去换,多试几次,
    d.BUF[1]=rxbuf[5];
    d.BUF[2]=rxbuf[4];
    d.BUF[3]=rxbuf[3];
回复

使用道具 举报

5

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-5-25
在线时间
86 小时
 楼主| 发表于 2017-5-11 16:32:02 | 显示全部楼层
enan 发表于 2017-5-11 12:31
没问题,
d.BUF[0]=rxbuf[6];  //这一段要你自己去换,多试几次,
    d.BUF[1]=rxbuf[5];

求大侠帮忙看下 我上传代码  发现串口打印不出浮点数数据

rs485_s_u_v2.1.0.rar

2.84 MB, 下载次数: 206

F407

笑着熬下去@_@
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-5-11 23:04:24 | 显示全部楼层
本帖最后由 enan 于 2017-5-11 23:16 编辑

Usart1_Send(CombineData);//串口1打印数据
首先不管你实现的方式对不对,第一点你这个函数就写的有问题,你串口要发一个浮点数出去,浮点数占四个字节,你这个发送函数没有指定发送的数据长度可以设置

然后我们姑且算你上面的函数加上的发送指定的字节数,那串口发出去的是什么?是这个浮点数在内存里的4个字节的16进制的数
你要把printf重定向到串口上,然后再printf("CombineData=%f",CombineData);
另外在printf之前最好判断一下CombineData是不是真的浮点数,好像专门有个函数判断浮点数的,名字忘记了。


操作一个非法的浮点数会导致MCU死机,STM32我没试过,但我在其他平台遇到过

回复

使用道具 举报

1

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2021-9-6
在线时间
59 小时
发表于 2021-9-13 10:23:28 | 显示全部楼层
大神,能否加个qq316134592,帮我搞个小程序。给您费用
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 22:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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