OpenEdv-开源电子网

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

485通信,多个从机的情况下,如何正确解析数据?

[复制链接]

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-20
在线时间
50 小时
发表于 2020-6-28 11:39:41 | 显示全部楼层 |阅读模式
6金钱
本帖最后由 嘿我可是太阳啊i 于 2020-6-28 11:41 编辑

大家好,小弟刚接触485,看了网上的一些资料,都说485可以接好多个从机,但是发出来的从机的串口程序都没有做地址区分判断,收到的数据有可能不是发给自己的。如果485总线上挂了2个从机,每个从机如何解析出属于自己的数据呢?如果主机发给从机1的数据里包含了从机2的地址,那么从机2会不会认为主机正在向自己发送数据?我大概写了一下通信过程和通信思路,请大家帮忙看看
SharedScreenshot.jpg

最佳答案

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

谢谢,问题已经解决了,可能是我没有表述清楚。 原来我百度的modbus协议,写的是每帧数据之间至少8个字符的时间间隔(帧结束占用4个字符时间,帧开始占用4个字符时间),单片机做不了这么短的定时,万一接收数据的时候,不是从帧头开始接收,而且通信线上又一直有数据,就没法区分正确区分每一帧了,可能认为第一帧的一半到第二帧的一半是一帧数据,第二帧的一半到第三帧的一半是一帧数据,第三帧的一半到第四帧的一半 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-20
在线时间
50 小时
 楼主| 发表于 2020-6-28 11:39:42 | 显示全部楼层
无痕幽雨 发表于 2020-7-2 07:34
协议解析不是这么做的,要么带有校验位,要么子长固定,要么带有帧头(并且数据里面不会出现这个)

    谢谢,问题已经解决了,可能是我没有表述清楚。
    原来我百度的modbus协议,写的是每帧数据之间至少8个字符的时间间隔(帧结束占用4个字符时间,帧开始占用4个字符时间),单片机做不了这么短的定时,万一接收数据的时候,不是从帧头开始接收,而且通信线上又一直有数据,就没法区分正确区分每一帧了,可能认为第一帧的一半到第二帧的一半是一帧数据,第二帧的一半到第三帧的一半是一帧数据,第三帧的一半到第四帧的一半是一帧数据 。。。,这样数据肯定是不对的,导致通信功能失效。
    现在我拿到了具体设备的协议,上面规定了主机发送的每一帧的数据间隔至少是200ms,这样单片机能够反应过来,哪怕是在第一帧的一半开始接收,在第二帧第一个字节数据过来的时候,与第一帧最后一个字节相差肯定是超过200ms了,单片机可以判断这个时间差,如果大于200ms,或者100ms,就认为是一帧新的数据,就可以正常解析出第二帧的数据了,通信功能正常恢复。
回复

使用道具 举报

0

主题

37

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1161
金钱
1161
注册时间
2018-5-24
在线时间
120 小时
发表于 2020-6-29 00:06:11 来自手机 | 显示全部楼层
从机会判断地址啊,不是发给自己的就不接受
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-6-29 01:24:54 | 显示全部楼层
规定就是规定,不会同时发送地址1和2的,除非你的规定有问题
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2020-5-12
在线时间
394 小时
发表于 2020-6-29 08:44:10 | 显示全部楼层
拿一个byte数据作为地址位就好了啦。从机只判断地址位来确定是否过滤
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2020-6-29 08:44:34 | 显示全部楼层
485这种总线,一般结合modbus之类的协议,第一步就是判断地址
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-6-29 09:33:17 | 显示全部楼层
485是半双工工作的不可能收到自己的数据,而且这个只能同时只有一个设备发送吧
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-20
在线时间
50 小时
 楼主| 发表于 2020-6-29 10:33:47 | 显示全部楼层
tanghanbo 发表于 2020-6-29 00:06
从机会判断地址啊,不是发给自己的就不接受

从机2地址是02,主机向从机1发数据的时候,包含了02字节,从机2会不会认为主机要发给自己数据呢?
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-20
在线时间
50 小时
 楼主| 发表于 2020-6-29 10:34:19 | 显示全部楼层
正点原子 发表于 2020-6-29 01:24
规定就是规定,不会同时发送地址1和2的,除非你的规定有问题

从机2地址是02,主机向从机1发数据的时候,包含了02字节,从机2会不会认为主机要发给自己数据呢?
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
发表于 2020-6-29 10:36:47 | 显示全部楼层
首先更正一下,485是通信接口方式,不是协议。
我看了一下,你说的是MODBUS协议吧
这个协议规定一次只发对一个地址的读写指令,不会包含几个从地址
因为协议规定了是点对点主从配对的
而你问的,不属于自己的指令(带地址非广播),从机是不会反应的
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-20
在线时间
50 小时
 楼主| 发表于 2020-6-29 11:07:12 | 显示全部楼层
笨鸟想飞 发表于 2020-6-29 10:36
首先更正一下,485是通信接口方式,不是协议。
我看了一下,你说的是MODBUS协议吧
这个协议规定一次只发 ...

你的意思是,主机给从机1发送的数据里面,不会有从机2的地址是吗?假设从机2的地址是02,主机1发给从机1的数据里,就不会有02这个数据?
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2020-6-29 13:22:21 | 显示全部楼层
地址是地址,数据是数据,你从机代码都不能区分,那这个代码就不是合格的代码
一分耕耘一分收获。
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-20
在线时间
50 小时
 楼主| 发表于 2020-6-29 14:08:39 | 显示全部楼层
yklstudent 发表于 2020-6-29 13:22
地址是地址,数据是数据,你从机代码都不能区分,那这个代码就不是合格的代码

如何区分地址和数据呢?
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2020-6-29 14:54:56 | 显示全部楼层
协议格式就是干这个的
一分耕耘一分收获。
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
发表于 2020-6-29 15:06:22 | 显示全部楼层
嘿我可是太阳啊i 发表于 2020-6-29 11:07
你的意思是,主机给从机1发送的数据里面,不会有从机2的地址是吗?假设从机2的地址是02,主机1发给从机1 ...

我讲详细点吧,其实你的问题在于  从机的协议判断

我们从机程序里会有对接收到的串口数据进行 协议判断(接收到的首位,末尾,校验位以及第二位的地址位)。
举个例子,主机发送控制01 地址的指令
那么485下的所有从机肯定能收到这个信息,可每个从机都会有协议判断(接收串口数据判断),判断是不是自己的,怎么判断?就是if(第一位==x)? 判断地址位是不是自己的,如果是自己的那就响应

不是自己的就不管,清空

而主机下发的指令,必须是只含单个从机地址的,(你自己创造一个新协议多个从机地址也可以,然而没必要)
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-20
在线时间
50 小时
 楼主| 发表于 2020-6-29 16:00:04 | 显示全部楼层
笨鸟想飞 发表于 2020-6-29 15:06
我讲详细点吧,其实你的问题在于  从机的协议判断

我们从机程序里会有对接收到的串口数据进行 协议判 ...

谢谢,前面的我都看懂了,就是最后一句,我还是不理解。假如有两个从机,从机1的地址是01,从机2的地址是02,主机向从机1发送指令,假设是20个字节,那么这20个字节不会包含从机2的地址(也就是0x02这个数据)是吗?如果不包含0x02,那我就没有疑问了,如果包含,从机2收到0x02以后,会不会认为是主机在向自己发送数据?
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
发表于 2020-6-29 18:06:45 | 显示全部楼层
嘿我可是太阳啊i 发表于 2020-6-29 16:00
谢谢,前面的我都看懂了,就是最后一句,我还是不理解。假如有两个从机,从机1的地址是01,从机2的地址是 ...

并不是,协议里面规定了,modbus协议里 20个字节中,第一位是地址位,第二位是功能码,后面的就是寄存器数据。从机地址只对第一位数据。
针对你举的例子,主机向从机1去发指令,那么发送的数据第一位绝对是 0x01。
而不是说所有数据里不包含0x02这个数据

再简单说吧,就像名字一样,第一个字就是姓。
这里协议建议你要看一下协议的结构你就很清楚了
第一位是地址码,第二位功能码
回复

使用道具 举报

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2020-4-22
在线时间
241 小时
发表于 2020-6-29 20:20:11 | 显示全部楼层
借楼,485电气特性是(0.2-6)V还是(2-6)V?
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-20
在线时间
50 小时
 楼主| 发表于 2020-6-30 08:57:55 | 显示全部楼层
笨鸟想飞 发表于 2020-6-29 18:06
并不是,协议里面规定了,modbus协议里 20个字节中,第一位是地址位,第二位是功能码,后面的就是寄存器 ...

谢谢,在正常情况下,通过解析第一个字节,也就是地址位,来判断数据是不是发给自己的,这个逻辑我理解。
我是担心会有这种情况发生:假设主机一直在和从机1、从机2交互数据,主机每次发送20个字节:
      数据1:第1个字节是01,表示数据是发给从机1的,第10个字节是02,表示发给从机1的某项数据。
      数据2:第一个字节是02,表示数据是发给从机2的,第10个字节是01,表示发给从机2的某项数据。
在通信过程中,从机2掉线了,然后在某一时刻又上线,从机2收到了02这个数据,它如何区分这个02是属于数据1的,还是数据2的?又因为主机一直在循环往外发送数据1和数据2,通信线上一直有数据,会不会从机2就一直解析不出正确数据了?
回复

使用道具 举报

11

主题

2153

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4938
金钱
4938
注册时间
2015-1-10
在线时间
619 小时
发表于 2020-6-30 13:41:34 | 显示全部楼层
本帖最后由 阿侑kevin 于 2020-6-30 13:44 编辑
嘿我可是太阳啊i 发表于 2020-6-30 08:57
谢谢,在正常情况下,通过解析第一个字节,也就是地址位,来判断数据是不是发给自己的,这个逻辑我理解。 ...

如果是定长的数据包,接收完了不去校验包长吗?还有通讯协议中要么发送每个包的时候中间有延时,接收机可以通过超时去区分每个包;要么加帧尾,用于区分每个包
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2020-6-30 13:43:54 | 显示全部楼层
嘿我可是太阳啊i 发表于 2020-6-30 08:57
谢谢,在正常情况下,通过解析第一个字节,也就是地址位,来判断数据是不是发给自己的,这个逻辑我理解。 ...

自己去研究下MODBUS协议就知道了
学无止境
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2020-7-2 07:34:53 来自手机 | 显示全部楼层
协议解析不是这么做的,要么带有校验位,要么子长固定,要么带有帧头(并且数据里面不会出现这个)
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
发表于 2020-7-2 11:31:24 | 显示全部楼层
嘿我可是太阳啊i 发表于 2020-6-30 08:57
谢谢,在正常情况下,通过解析第一个字节,也就是地址位,来判断数据是不是发给自己的,这个逻辑我理解。 ...

你这种情况的话,从机的协议判断不可能响应。为什么?
因为协议上有校验码,校验码就是用来应对你说的那种情况

什么是校验码?校验码就是 规定了,数据位的总和取高低位(不同协议不同规则),用校验码是来判定从机自己接收的数据是否是完整的

从机自己的判定协议接收,一般分几个if,逐层深化:
1、判断帧头帧尾,先判断自己接收到的第一个字节,是否是自己的地址,如果是,继续下一步判断
2、判断校验码,把接收到的数据包中数据位的和,与检验码是否一致,是的话表示是完整的一帧
3、各个功能码判断实现操作
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-20
在线时间
50 小时
 楼主| 发表于 2020-7-2 13:41:02 | 显示全部楼层
笨鸟想飞 发表于 2020-7-2 11:31
你这种情况的话,从机的协议判断不可能响应。为什么?
因为协议上有校验码,校验码就是用来应对你说的那 ...

    谢谢,问题已经解决了,可能是我没有表述清楚。
    原来我百度的modbus协议,写的是每帧数据之间至少8个字符的时间间隔(帧结束占用4个字符时间,帧开始占用4个字符时间),单片机做不了这么短的定时,万一接收数据的时候,不是从帧头开始接收,而且通信线上又一直有数据,就没法区分正确区分每一帧了,可能认为第一帧的一半到第二帧的一半是一帧数据,第二帧的一半到第三帧的一半是一帧数据,第三帧的一半到第四帧的一半是一帧数据 。。。,这样数据肯定是不对的,导致通信功能失效。
    现在我拿到了具体设备的协议,上面规定了主机发送的每一帧的数据间隔至少是200ms,这样单片机能够反应过来,哪怕是在第一帧的一半开始接收,在第二帧第一个字节数据过来的时候,与第一帧最后一个字节相差肯定是超过200ms了,单片机可以判断这个时间差,如果大于200ms,或者100ms,就认为是一帧新的数据,就可以正常解析出第二帧的数据了,通信功能正常恢复。
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-20
在线时间
50 小时
 楼主| 发表于 2020-7-2 13:41:34 | 显示全部楼层
阿侑kevin 发表于 2020-6-30 13:41
如果是定长的数据包,接收完了不去校验包长吗?还有通讯协议中要么发送每个包的时候中间有延时,接收机可 ...

    谢谢,问题已经解决了,可能是我没有表述清楚。
    原来我百度的modbus协议,写的是每帧数据之间至少8个字符的时间间隔(帧结束占用4个字符时间,帧开始占用4个字符时间),单片机做不了这么短的定时,万一接收数据的时候,不是从帧头开始接收,而且通信线上又一直有数据,就没法区分正确区分每一帧了,可能认为第一帧的一半到第二帧的一半是一帧数据,第二帧的一半到第三帧的一半是一帧数据,第三帧的一半到第四帧的一半是一帧数据 。。。,这样数据肯定是不对的,导致通信功能失效。
    现在我拿到了具体设备的协议,上面规定了主机发送的每一帧的数据间隔至少是200ms,这样单片机能够反应过来,哪怕是在第一帧的一半开始接收,在第二帧第一个字节数据过来的时候,与第一帧最后一个字节相差肯定是超过200ms了,单片机可以判断这个时间差,如果大于200ms,或者100ms,就认为是一帧新的数据,就可以正常解析出第二帧的数据了,通信功能正常恢复。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 19:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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