我有一台计算机(用作服务器)和几块带有Atmega
微控制器的板,类似于:
计算机连接到UART
& RS485
(使用USB
到RS485
转换器)上的板卡(我有导致I不能使用ModBus的限制)。我希望通过总线从服务器广播一个消息,并从每个板子中获取ID (板ID是4位数字)。
当董事会接收到广播消息,并试图发送自己的ID和服务器收到一些假ID,我认为这与碰撞问题,当所有的董事会想要一次发送数据。
在我搜索了这个问题之后,我找到了一种方法,在每个板中放置一个常量,这样可以为发送数据节省一个特殊的延迟,并且当板接收到广播消息发送ID时,这样做很好,而且我看不到碰撞,但有一些问题:
任何人都知道这个问题,并能帮助我更好地解决这个问题。
发布于 2017-07-10 17:11:52
你在你的问题中提到了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
这可能需要相当长的时间,并且需要根据广播响应和响应ack的传输时间精细地调整等待时间,但可以工作,实际上在许多CSMA/CD网络中都是这样实现的。
发布于 2017-07-09 15:59:02
这可能需要更长的时间,但这里有另一种方法。首先,设计您的协议,以便每个命令包含(或可以包含)一个ID,并且板只响应其ID的命令。然后,在您的主机上,您将遍历每个可能的ID,并向每个ID发送一个简单的命令。如果你得到一个回应,你知道有一个板有那个ID,如果你在一段时间后没有得到回应,你就知道那里没有板。
https://stackoverflow.com/questions/44994868
复制相似问题