【问题标题】:Arduino: Packet loss on Serial communicationArduino:串行通信丢包
【发布时间】: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


【解决方案1】:

这里是关于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 选择从设备

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

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

【讨论】:

  • 谢谢。您的第一个链接对我来说似乎很有希望。我只需要给每个板一个唯一的地址就可以了。我仍然需要弄清楚不同的电源是否有问题。我需要为每个电源添加上拉电阻,以便能够组合任何电路板。从您的第二个链接中,我认为 I2C 将是我比 SPI 更好的选择。我实际上没有考虑过无线通信,因为我预计它的使用会复杂得多。不过我会调查的。
  • 这里是实现射频网络的库的链接 - maniacbug.github.io/RF24Network
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多