在UART上广播和获取数据

时间:2017-07-09 09:21:17

标签: collision avr uart atmega rs485

我有一台计算机(用作服务器)和几块带Atmega微控制器的电路板:

computer and board

计算机连接到UART&上的电路板。 RS485(使用USBRS485转换器(我有限制导致我无法使用ModBus )。我希望从服务器通过总线广播消息并从每个主板上获取ID(主板ID 4位)。

当主板收到广播消息并尝试发送自己的ID并且服务器收到一些假身份证时,我认为当所有主板都希望一次发送数据时,它与Collisions问题有关。 / p>

在我搜索到这个问题之后找到了一种方法,在每个电路板中放置一个常量,为发送数据保存特殊延迟,当电路板接收广播消息发送带有该延迟的ID时......这样它工作正常,我不看到碰撞,但有一些问题:

  1. 可能是2板的延迟数相同。
  2. 小板数的好方法。
  3. 想在公交车上安装电路板时的额外处理。
  4. 有人知道这个问题并且可以帮助我如何用更好的解决方案解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

你在提问时提到了Modbus,虽然你的其他一些陈述的事实似乎与那里不同(例如4位设备号,而Modbus只有1-255)。此外,Modbus 不支持支持对广播消息的响应。因此我怀疑你实际上是在使用Modbus。

您可以使用的方案(在MA网络中经常使用)将是:

  1. 一旦收到广播,让客户端根据其站点ID扫描总线以获取时间范围的响应。如果您的客户端可以看到一个,请等待最短的总线时间(模块需要根据当前总线时序回答您的广播消息的时间+主机确认广播应答的往返时间)以及基于其模块的额外时间ID,然后返回(1)
  2. 如果客户端看到指定时间内未被占用的总线,请发回广播应答。
  3. 让主人用最短的消息确认来自该客户的广播响应。
  4. 如果发送广播响应的客户端未收到适当的确认,请返回(1)
  5. 这不是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的董事会。如果你在一段时间后没有收到回复,你知道那里没有董事会。