Arduino:串行通信丢包

时间:2014-04-20 09:50:54

标签: serial-port arduino i2c packet-loss

我正在尝试通过其串行引脚连接多个Arduino Mega Boards以允许板之间的通信。我希望能够通过菊花链接连接任意数量的arduinos,我希望一块板成为主板,控制其他板的动作。主机应由主板动态确定。我知道菊花链方法由于数据包转发而导致通信延迟,但到目前为止,我计划最多连接4个板。在未来,这可能会增加到10个板。我的电路板都有一个独立的电源,因为它们连接到其他具有自己电源的硬件上。

我的想法是以这样的方式连接电路板,主电源将由电路板连接决定。我想过将“Serial”端口作为“To-Master”串口,将“Serial1”端口作为“To-Child”串口。单板在“To-Master”串口上发送hello消息,如果主机在“To-Child”串口上收到这样的消息,则主机回复。如果在几秒钟后没有收到答复,则委员会确定自己是主人。

我通过连接接地引脚连接电路板,并将主设备的RX1连接到子设备的TX0和主设备的TX1连接到子设备的RX0:

Wiring of the boards

基本上我的设置正常,因为主板确实互相检测并交换了问候消息和回复。但是,我想消除大量的数据包丢失或损坏。

作为数据包验证的简单衡量标准,我使用“幻数”开始每个数据包。接收板查找该字节,仅在接收到该字节后尝试读取数据包。收到的任何其他字节都被丢弃了。

看起来,经常会发生在任何一个串行端口上收到的东西,它不以幻数开头,因此被丢弃。然而,这些事件的时间戳与发送另一个板的时间戳一致,这意味着该数据包至少部分地被传输,但不知何故魔术字节被破坏或丢弃。

这是arduinos串口的已知问题吗?

它可以与我的布线有关吗?

我是否可以采取任何措施来确保数据包的保存传送?

电路板在正确的时间没有读取信号会出现问题吗(我使用波特率为9600)?

我也研究了I2C通信,但是如果可以为这种类型的通信动态选择主设备,我找不到任何资源或信息。同样在其声明的文档中,重要的是所有设备共享一个在我的场景中不可能的公共电源。但是,这个I2C的基本主从原理符合我的要求,因为我有一个主控器向所有其他板发送命令。在我的情况下可以使用I2C吗?

感谢您的想法!

2 个答案:

答案 0 :(得分:0)

以下是关于Arduinos的多主I2C拓扑的讨论,似乎它是受支持的(我自己未经过测试)。 - 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选择从站

我不知道串行总线上多任何已知的多客户端实现(通常只用于peer2peer通信) - 即使你的配置看似合理,我也会考虑其他选择。

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

答案 1 :(得分:0)

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

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

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

相关问题