【发布时间】:2014-06-04 12:50:58
【问题描述】:
我正在尝试通过它们的串行引脚连接多个 Arduino Mega 板,以允许板之间的通信。我希望能够通过菊花连接任意数量的arduino,并且我希望一个板成为主机,控制其他板的动作。主控应由板动态确定。我知道菊花链方法会由于数据包的转发而导致通信延迟,但到目前为止,我计划最多连接 4 个板。将来,这可能会增加到 10 个板。我的板子都有一个单独的电源,因为它们连接到其他一些有自己的电源的硬件。
我的想法是以这样的方式连接电路板,即主机将由电路板的接线确定。我想过将“Serial”端口作为“To-Master”串口,将“Serial1”端口作为“To-Child”串口。板卡在“To-Master”串口上发送 hello 消息,如果在“To-Child”串口上收到这样的消息,主机会回复。如果几秒钟后没有收到任何答复,则该板确定自己是主控。
我通过连接接地引脚将电路板连接起来,并将主设备的 RX1 连接到子设备的 TX0,将主设备的 TX1 连接到子设备的 RX0:
基本上我的设置是有效的,因为板确实会相互检测并交换问候消息和回复。但是,我想消除大量的数据包丢失或损坏。
作为一种简单的数据包验证措施,我以“幻数”开始每个数据包。接收板查找这个字节,只有在收到这个字节后才尝试读取数据包。接收到的任何其他字节都将被丢弃。
看起来,在任一串行端口上接收到的东西不是以幻数开头并因此被丢弃的情况经常发生。然而,这些事件的时间戳与另一块板的发送时间戳一致,这意味着数据包至少部分传输,但不知何故魔术字节被损坏或丢弃。
这是 arduinos 串行端口的已知问题吗?
会不会和我的接线有关?
我可以采取什么措施来确保数据包的保存交付?
可能是板子没有在正确的时间读取信号的问题(我使用了 9600 的波特率)?
我也研究了 I2C 通信,但我没有找到任何资源或信息,如果可以为这种类型的通信动态选择主设备。同样在文档中指出,所有设备共享一个公共电源很重要,这在我的场景中是不可能的。但是,这个I2C的基本主从原理符合我的要求,因为我有一个向所有其他板发送命令的主。在我的情况下可以使用 I2C 吗?
感谢您的意见!
【问题讨论】:
-
使用公共总线,如 I2C,需要不同类型的总线电气接口。使您的方案工作需要一种协议,一种将数据包从一个节点传输到另一个节点的可靠方法。能够检测数据包的开始和结束,因此每个节点都可以解释数据包内的特定字段,例如节点地址,这一点非常重要。拥有多个主人需要类似于“令牌环”的东西。曾经也用于网络,但由于可靠性问题而在很大程度上被遗忘了。
-
谢谢。其实我不想同时拥有多个大师。我只希望板子自动确定一个作为主控板,而无需用户明确选择一个。
-
嗯,这是一个先有鸡还是先有蛋的问题。为了协商哪个是主控,您确实需要允许任意主控的选项。也许你应该把目标放低一点,你还没有接近完成这项工作。
标签: serial-port arduino i2c packet-loss