OpenEdv-开源电子网

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

RS485总线发生总线冲突,如何解决

[复制链接]

13

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-9-3
在线时间
26 小时
发表于 2017-5-26 12:06:46 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 stm32zzq 于 2017-5-26 14:22 编辑

主机和从机采取RS485半双工总线,主机和上位机用全双工通信,但是发现主从总线冲突,详细情况是主机以50ms周期给从机发送查询命令,并做超时重发处理,在串口助手里上位机对主机发送开关灯的指令,主机收到上位机的命令时需要对从机进行控制处理,目的是让主机控制从机开关灯并返回开关灯状态给主机,主机再返回给上位机,问题是有时候主机发给从机的控制命令从机收不到(情况1),有时候主机发给从机的控制命令从机收到了并且返回给主机,此时主机却收不到了(情况2),本人猜想:情况1的原因是因为从机正在对主机的查询命令进行应答,情况2的原因是因为从机给主机返回控制应答的时候正好主机又给从机发送查询命令,半双工收发冲突。求助各位大神,我的想法是否正确,如果是,那么怎么解决;如果不是,那么又是什么问题?
搜狗截图20170526142051.png
图片1.png

最佳答案

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

上modbus协议,完美解决你的问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2017-5-26 12:06:47 | 显示全部楼层
上modbus协议,完美解决你的问题
电子爱好者
回复

使用道具 举报

9

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-4-26
在线时间
64 小时
发表于 2017-5-26 12:34:48 | 显示全部楼层
从机没必要返回控制应答
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-5-26 13:54:31 | 显示全部楼层
yklstudent 发表于 2017-5-26 13:13
主机/从机/上位机,这三者都在一个RS485网络中?

应该不在一个网络里,他说主机与从机用485通讯半双工,上位机与主机全双工通讯,
485只能半双工,485要全双工要换422总线
上位机与主机通讯应该是用的232通讯,或者是422.

我估计是他的串口程序写的有问题。
回复

使用道具 举报

13

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-9-3
在线时间
26 小时
 楼主| 发表于 2017-5-26 14:15:21 | 显示全部楼层
合六斗 发表于 2017-5-26 12:34
从机没必要返回控制应答

协议规定主机要获取从机的信息,所以如果从机不应答的话,主机的访问就没意义了
回复

使用道具 举报

13

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-9-3
在线时间
26 小时
 楼主| 发表于 2017-5-26 15:01:05 | 显示全部楼层
enan 发表于 2017-5-26 13:54
应该不在一个网络里,他说主机与从机用485通讯半双工,上位机与主机全双工通讯,
485只能半双工,485要 ...

我试过把周期50ms里的发送查询命令的函数屏蔽掉,在串口助手上用电脑控制发送指令让主机来控制从机,这时候主机和从机的通信没有丢失数据
回复

使用道具 举报

7

主题

11

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-5-26
在线时间
5 小时
发表于 2017-5-26 15:35:15 来自手机 | 显示全部楼层
和主机进行交互时把定时查询的定时器中断关了是不是会好些?
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-5-26 15:39:45 | 显示全部楼层
情况1主机发给从机的控制命令从机收不到
情况1的原因是因为从机正在对主机的查询命令进行应答,

你从机是个算盘啊?这么慢,72MHz的机器周期是13.89ns,你写或查询个IO口半ms都不到,不可能从机还忙着查询上次主机要他干的事。
是不是你协议上没有定义好,这跟波特率和控制命令长度有关,50ms轮询一次,如果你用的是9600波特率,控制命令长度超过50个字节,9600波特率每ms差不多1给字节,就是说你有可能主机控制命令才发完,从机才收到还没开始处理,又来了第二次控制命令。


情况2有时候主机发给从机的控制命令从机收到了并且返回给主机,此时主机却收不到了
情况2的原因是因为从机给主机返回控制应答的时候正好主机又给从机发送查询命令,半双工收发冲突。

还是刚才那个问题,你把时间改长点500ms试试
回复

使用道具 举报

13

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-9-3
在线时间
26 小时
 楼主| 发表于 2017-5-26 15:50:43 | 显示全部楼层
本帖最后由 stm32zzq 于 2017-5-26 16:02 编辑
enan 发表于 2017-5-26 15:39
情况1主机发给从机的控制命令从机收不到
情况1的原因是因为从机正在对主机的查询命令进行应答,

试过100ms为周期,还是有同样的问题,另外我定义的一帧数据最多12个字节,波特率是9600,周期改成500ms,出现的概率小一点
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-5-26 15:55:00 | 显示全部楼层
如果除去硬件问题(如485总线太长,有信号反射,要阻抗匹配等或其他设备干扰),那是你程序框架写的有问题,通讯要定义好协议,特别是不定长的要定时去判断他的接收是否完成
回复

使用道具 举报

13

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-9-3
在线时间
26 小时
 楼主| 发表于 2017-5-26 16:05:15 | 显示全部楼层
enan 发表于 2017-5-26 15:55
如果除去硬件问题(如485总线太长,有信号反射,要阻抗匹配等或其他设备干扰),那是你程序框架写的有问题 ...

有的,我在485中断那里每次接收到数据就清空定时器值,第一个字节开启定时器,定时器中断周期是10ms,进入定时器中断后立刻关闭定时器,将标志位置1标志着接收到一帧完整的数据,main中判断标志位是1就处理解析一帧数据
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-5-26 16:09:14 | 显示全部楼层
stm32zzq 发表于 2017-5-26 16:05
有的,我在485中断那里每次接收到数据就清空定时器值,第一个字节开启定时器,定时器中断周期是10ms,进 ...

10ms太长,9600波特率改个3到4ms就远远满足了,
如果这都不行你拿示波器或逻辑分析仪放485总线上看把,到底是谁出了错,
回复

使用道具 举报

13

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-9-3
在线时间
26 小时
 楼主| 发表于 2017-5-26 17:16:38 | 显示全部楼层
enan 发表于 2017-5-26 16:09
10ms太长,9600波特率改个3到4ms就远远满足了,
如果这都不行你拿示波器或逻辑分析仪放485总线上看把, ...

示波器还不熟,问下大神,主要观察的指标有哪些的呢
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-5-26 17:30:59 | 显示全部楼层
用逻辑分析仪,这个简单,选好你的硬件通讯接口,采样10M,带宽2M,逻辑分析仪拿个通道接485A,地线接485B,协议选串口,直接可以看到总现场主机从机发送的数据,什么时候发送,发送的什么数据,从机收到数据后隔了多久回复的,都可以看到
回复

使用道具 举报

9

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-4-26
在线时间
64 小时
发表于 2017-5-27 08:45:14 | 显示全部楼层
用串口助手收个数据,先排除硬件问题。再调整时间吧。485只能同时一方发送。
以我资质之驽钝,当平心静气、循序渐进、稳扎稳打,不辜负他人勉励。
回复

使用道具 举报

9

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2017-4-26
在线时间
64 小时
发表于 2017-5-27 08:46:11 | 显示全部楼层
有条件尽量不用485,太麻烦。
以我资质之驽钝,当平心静气、循序渐进、稳扎稳打,不辜负他人勉励。
回复

使用道具 举报

13

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-9-3
在线时间
26 小时
 楼主| 发表于 2017-5-27 09:18:04 | 显示全部楼层
enan 发表于 2017-5-26 17:30
用逻辑分析仪,这个简单,选好你的硬件通讯接口,采样10M,带宽2M,逻辑分析仪拿个通道接485A,地线接485B, ...

好的,谢谢您,学习了
回复

使用道具 举报

13

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-9-3
在线时间
26 小时
 楼主| 发表于 2017-5-27 09:19:04 | 显示全部楼层
合六斗 发表于 2017-5-27 08:46
有条件尽量不用485,太麻烦。

硬件没有问题,已经验证过了,同时有相关规定只能用485
回复

使用道具 举报

17

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2012-11-3
在线时间
30 小时
发表于 2017-5-27 10:57:03 | 显示全部楼层
本帖最后由 abb200628 于 2017-5-27 10:58 编辑

主机采用双串口,一个串口作为485主机和多个从机通信,另一个主机的串口作为通信从机和电脑通信。这样能解决你遇到的问题
老夫驾鹤,有事烧纸!
回复

使用道具 举报

13

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-9-3
在线时间
26 小时
 楼主| 发表于 2017-6-2 09:02:05 | 显示全部楼层
abb200628 发表于 2017-5-27 10:57
主机采用双串口,一个串口作为485主机和多个从机通信,另一个主机的串口作为通信从机和电脑通信。这样能解 ...

我的本来就是这样的啊,主机USART1作为和多个从机通信的485半双工串口,USART2作为和电脑通信的最简单的全双工串口
回复

使用道具 举报

17

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2012-11-3
在线时间
30 小时
发表于 2017-6-14 09:04:45 | 显示全部楼层
stm32zzq 发表于 2017-6-2 09:02
我的本来就是这样的啊,主机USART1作为和多个从机通信的485半双工串口,USART2作为和电脑通信的最简单的 ...

我理解错了, 仔细看了你说的情况,我感觉应该是你程序没处理好
老夫驾鹤,有事烧纸!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-18 09:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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