0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

485

论RS485总线如何实现多主通信

    RS485是一种常用的工业现场总线,由于其只是电气连接,所以在使用时,还需要一个通信协议来定义各设备的具体通信方式,以实现多设备有秩序地使用总线。

一般地,RS485总线上所使用的是一主多从通信协议,采用轮询方式进行数据通信。也即一条RS485总线上,只有一台主机,其余的都是从机,主从机之间要进行通信时,是需要主机依次轮询,轮询到了要发数据的从设备,从设备才能发送数据。这种通信方式存在通信实时性,可靠性差,而且各个从设备之间是不能通信的。另一种稍微高级一点的RS485通信协议可以实现从设备之间的通信,但这还是需要主设备的协调。有点类似于USB通信协议,工作机理大致如下:从设备首先向主设备发送数据发送请求或数据,再由主设备将数据发送给另外的从设备这种方式。

    我想构建一种基于RS485总线的多主通信协议,所有挂载在RS485总线上的设备均可自由地使用总线,而不需要先向主机申请。这样的话就能够大大提高地提高总线上设备的实时性,可靠性。在这之中,比较关键要解决的是:总线竞争以及仲裁机制。

为此,我设计了这样一个机制:设备在RS485总线进行数据发送前,先检测当前总线是否有数据正在传输,如果没有,则先发送一串数据,用以声明总线被占用。然后进行有效数据发送,并等待DATA_ACK.

数据目标设备在接收到数据后,此时仅可发送DATA_ACK信息,用以告诉数据发送设备已经收到信息。之后数据发送设备,再次在总线上发送信息,声明释放总线。在这期间,其它挂接在RS485总线上的设备也能够接收到数据,不过因为总线已经被声明占用,将不得

发送任何数据。

    在这之中,发现两个可能的原因还是会导致总线竞争:    1、RS485总线上的设备接收到的总线占用和总线释放声明信息有误码,导致解析失败。设备就相当于没有收到总线占用和释放声明,而如果这个期间进行数据发送,就可能出错。

    2、RS485总线上,有两个或多个设备,同时声明总线占用。此时已经导致总线竞争,从而所有设备都没有收到有效的总线占用信息,那么之后的数据发送仍会很有可能出现总线竞争。

    当然,所有的设备在进行任何数据发送前,都会先进行总线载波检测,以判断当前总线上是否有数据发送。但仍有一定的概率出现两设备几乎同时开始发送一串数据的第一位数据,从而导致竞争。

    查看了一下CAN总线的总线竞争以及仲裁机制,其接口芯片可以一边发送,一边读取当前总线状态,如果发送位和读取到的总线状态不一致,则自动丢失总线权,这种非破坏的总线竞争方式挺好,就是貌似RS485上无法实现,因为RS485芯片不能边发送边读取。

大家麻烦给点意见哦,也不知有哪位成功实现了这种多主通信的吗?

=====================================================分割线=========================================================>>

结贴前,对大家讨论的结论归纳如下:

要实现RS485总线上的多主通信机制,首先在硬件设计上,需要能够让485芯片的TX和RX使能分别单独控制;采用半驱方式进行485总线驱动更好,这样可以实现类似CAN总线的总线竞争检测以及仲裁机制;

软件设计上,每个设备在进行总线数据发送前,必须先侦听总线是否有数据正在传输,如果没有,则启动传输。在传输的过程中,在逐字节地发送数据的同时,也一直侦听并读取总线上的数据,如果读取到的数据和发送的不一致,就说明总线上此时还有其它设备正在发送,由此实现总线竞争检测;

如果要做到类似CAN的无破坏总线竞争检测以及仲裁,那么还需要做到传输数据的逐位检测,不过这貌似对一般的Uart口来说并不容易实现;

另一种比较稳定的多主通信方式就是使用令牌,令牌在各个设备之间传递,只有拥有令牌的设备才有总线使用权。

以上为讨论后的归纳总结,非常谢谢各位朋友的指点。

提问者:一个黄人 地点:- 浏览次数:6753 提问时间:10-15 18:12
我有更好的答案
提 交
5条回答
木木川BB 07-17 08:57
1.首先要解决电气层的冲突,半驱基本可以;
2.要有退出和重试机制。
上面2条都可以参考CAN的做法。
云汉007 07-09 02:30
半驱是指:485芯片只发送逻辑0,而逻辑1则由485接收方由失效保护的上下拉得到,简而言之,485芯片的TxD端接地,MCU的TxD反相后接到485的DE端,485的RE始终使能。
退出应是发送者自觉的,只要监测到自己发送的数据有误(应检查每个字节),就停止发送。
任何发送者在发送前必须探测总线状态,遇忙应随机延时后重新探测。
60user80 07-15 00:02
全双工的485可以实现边发边收的。你这个多主机的没想过,485的双机通讯就是可以做到主从切换的。
testd28 07-13 05:56


谢谢建议,我上网查了一下,找到了一个RS485全双工的硬件连接图,如下:

如果该图正确的话,即RS485全双工工作时,设备接收端接在其它设备的发送总线上,设备的发送端接在其它设备的接收总线上。这样的话,如果还是有两个设备同时要发送数据,产生了总线竞争,依然是不能检测到的。
我猜想这种全双工的RS485应该还是工作在主从模式,最左边的应该是主机,因为其发送端接在其它几个设备的接收端。那么主机发送到从机的信息是不会产生竞争的,而从机要发送数据,则要和其他从设备共用总线,如果要避免竞争,肯定还是需要
主机设备来从中协调。
我准备这样来做个试验:使用半双工的RS485芯片,其内部结构如下:

可以看出,其内部结构的接收和发送是各自由独立管脚控制的,所以我想这样设置:SP485芯片的RE管脚一直拉低,使RO管脚能够一直吐出总线上的有效数据。设置DE管脚平时为低,发送数据时,为高进行数据发送,发送完毕后又置低。
这样,当数据发送完毕后,其实发送设备自己也应该收到一份自己发出的数据。
查看该芯片的收发真值表,如下:

从左图可以看出:当发送数据时,RE管脚的电平不影响数据发送。从右图来看:当接收数据时,DE管脚都是设置为0,但也并没明确说明DE为1就不行。因为我刚开始调试485时,有遇到过自己发送的数据自己能收到的现象,估摸就是因为当时芯片的RE和DE管脚是各自分开控制的。
接下来准备做个试验来验证下,如果可行的话,就可以实现类似CAN总线的总线竞争检测机制了。;)
qp_12 07-12 23:54
这种冲突检测+竞争想靠软件做好还是不容易的,RS485多主总线大多都是采用令牌总线方式
撰写答案
提 交
1 / 3
1 / 3
相关485
最近被485电了很多次了,求大神分析下为什么
隔离485通信接口芯片ADM2483供电问题
求助 关于单片机与485总线 命令帧的发送和响应帧的接收
485通讯如何寻址
RS485总线 感应电流