1

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

谢谢你的想法!

4

2 回答 2

0

就像人们在这里建议的那样,使用 I2C 或 SPI 可能会更好。

但是,要直接解决您的问题,很可能是接线。我假设您使用便宜的跳线直接插入 Arduino 接头。此连接上的噪音最有可能是问题或乱码串行消息。尝试使用双绞线电缆并直接连接到电路板。

SPI 或 I2C 可能比您的客户串行协议具有更好的纠错能力。我会看到其他答案。

于 2014-04-20T18:52:00.883 回答
0

Here is an discussion about multi-master I2C topology of Arduinos,似乎是支持的(我自己没有测试过)。- http://forum.arduino.cc/index.php/topic,13579.0.html

您也可以测试 SPI,这是两者之间的比较 - http://components.about.com/od/Theory/a/Selecting-Between-I2c-And-Spi.htm。可以使用通用 GPIO 选择从设备

我不知道任何已知的串行总线之上的多客户端实现(通常它仅用于对等通信) - 即使您的配置似乎合理,我也会考虑其他选项。

顺便说一句,根据您对不同电源的评论,我认为您的电路板彼此远离。您是否考虑过非常便宜(2 美元)的射频模块,例如 nRF24L01+(http://maniacbug.wordpress.com/2011/11/02/getting-started-rf24/)。这是一个用于在多节点网络中联网的库

于 2014-04-20T10:36:55.060 回答