我有一台计算机(用作服务器)和几块带Atmega
微控制器的电路板:
计算机连接到UART
&上的电路板。 RS485
(使用USB
到RS485
转换器(我有限制导致我无法使用ModBus )。我希望从服务器通过总线广播消息并从每个主板上获取ID(主板ID 4位)。
当主板收到广播消息并尝试发送自己的ID并且服务器收到一些假身份证时,我认为当所有主板都希望一次发送数据时,它与Collisions问题有关。 / p>
在我搜索到这个问题之后找到了一种方法,在每个电路板中放置一个常量,为发送数据保存特殊延迟,当电路板接收广播消息发送带有该延迟的ID时......这样它工作正常,我不看到碰撞,但有一些问题:
有人知道这个问题并且可以帮助我如何用更好的解决方案解决这个问题吗?
答案 0 :(得分:1)
你在提问时提到了Modbus,虽然你的其他一些陈述的事实似乎与那里不同(例如4位设备号,而Modbus只有1-255)。此外,Modbus 不支持支持对广播消息的响应。因此我怀疑你实际上是在使用Modbus。
您可以使用的方案(在MA网络中经常使用)将是:
这不是100%安全,绝对不符合Modbus规范,但可以工作。
* is a transmission, - is a "wait"
**** (Bus master broadcast)
--------- station 100 waits 100ms
------------------ station 200 waits 200ms
**** Station 100 sends broadcast response
------------------ station 200 sees bus active and waits another 200ms
*** master acknowledges broadcast response of 100
------------------ station 200 sees bus active again and waits 200ms from last seen activity
**** Station 200 has seen bus quiet for 200ms and sends broadcast response
*** master acks brc response of 200
这可能需要相当长的时间,并且需要根据广播响应和响应时间的传输时间进行精细调整,但是可以工作,并且实际上是在许多CSMA / CD网络中实现的。
答案 1 :(得分:0)
可能需要更长时间,但这是另一种方法。首先,设计您的协议,以便每个命令包含(或可以包含)ID,并且板仅响应其ID的命令。然后,在主机上,您将迭代每个可能的ID并向每个ID发送一个简单的命令。如果您收到回复,您知道有一个具有该ID的董事会。如果你在一段时间后没有收到回复,你知道那里没有董事会。