首页 文章

Arduino:串行通信丢包

提问于
浏览
1

我正在尝试通过其串行引脚连接多个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

    以下是关于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/) . 这是一个用于在多节点网络中联网的库

  • 0

    人们在这里建议使用I2C或SPI可能会更好 .

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

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

相关问题