本帖最后由 幸福至上 于 2016-5-12 15:39 编辑
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口来说并不容易实现;
另一种比较稳定的多主通信方式就是使用令牌,令牌在各个设备之间传递,只有拥有令牌的设备才有总线使用权。
以上为讨论后的归纳总结,非常谢谢各位朋友的指点。
|
看到大家还在就此问题继续讨论到现在,也再来说明下。当初这个思路是正确的,现在我所设计的产品已经成功实现了基于RS485的多主通信机制。电气接口采用半驱方式,以一直保持从总线上读取数据。发送仅在有数据需要传送时生效。再在软件上做好总线竞争判断,重传及超时等机制,在总线上的任一设备可以在任一时刻随意发送数据的。