我正在尝试通过它们的串行引脚连接多个 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 吗?
谢谢你的想法!