用 arduino 切换 3 个双向通信通道的最佳方法

Posted

技术标签:

【中文标题】用 arduino 切换 3 个双向通信通道的最佳方法【英文标题】:Best way to switch 3 bidirectional communication channels with an arduino 【发布时间】:2014-06-18 08:07:28 【问题描述】:

我正在尝试设计一个 PCB,其中包含一个带 UART 接口的 CO2 传感器、一个使用 UART 的 Xbee 模块和一个 AtMega328 芯片。因为我在 AtMega328 上只有一个 UART,所以我将 SoftwareSerial 用于 CO2 模块。 Xbee 模块直接连接到 Atmega328 上的数字引脚 0 和 1(TX、RX)。这意味着如果我想对 Atmega328 进行编程,我必须断开 Xbee,反之亦然。 (编辑:我希望通过硬件串行保持 Xbee 连接。将 Xbee 连接到 SoftwareSerial 会阻止我对其进行配置和更改固件)。

在我之前尝试解决此问题时,我使用了 6 针接头和跳线 (3x2)。为了将 Xbee 连接到 Serial,我创建了一条将外部引脚连接在一起的电缆,让我可以刷新 Xbee 的固件。

我希望它由 Arduino 控制。就我对电子产品的有限了解而言,我将使用多个“双刀双掷”开关。如果我会使用(例如)NX3L2467,这会给我以下选项:

(F = FT232 UART 转 USB,D = ArDuino,X = Xbee 模块)。在我的示例中,我使用 5Y* 和 6Y* 来寻址第二个开关上的 1Y* 和 2Y* 引脚。

这反过来会产生以下真值表:

这种结构可以让我做我想做的事,将 Xbee 连接到 Duino,将 Duino 连接到 FTDI,将 FTDI 连接到 Xbee。使用其中两个开关是否是管理此问题的最有效方法,而无需转移到另一个微控制器?是否有一种 IC 能够在这些设备之间进行切换,而无需在每个连接之间设置两个“开关”?

【问题讨论】:

您可以使用 µC 的另一个接口并将其转换为 uart,例如 SPI2UART,而不是多路复用 uart 线路。这可能不符合成本效益,但如果您使用 arduino 和 xbee shield,我想成本不是您的主要限制因素。 我有一个定制的 PCB,上面有 SMD Arduino 和 Xbee 插座。在这个项目中,成本无疑是一个制约因素。我去看看 SPI2UART 项目,谢谢!我想我的问题不够清楚,我想我正在寻找硬件解决方案,但我不确定这个 *** 问题中提出的设置是否最有效。 【参考方案1】:

最便宜的解决方案是使用跳线。

如果您想要一个更“优雅”的解决方案,您可以使用一些三态缓冲器或一些数字多路复用器和多路解复用器来代替某些开关。

这是一个例子:

橙色有两个多路复用器,绿色有两个解复用器。 F- 是 FT232 引脚,X- 是 XBee 引脚,(猜猜看)A- 是 Arduino 引脚。

这是连接表:

FT232 XBee:a=0,b=1,c=1,d=0 FT232 Arduino:a=0, b=0, c=0, d=0 XBee Arduino:a=1, b=1, c=1, d=1

如您所见,a 和 d 总是相同的,就像 b 和 c。因此,您可以通过两个引脚(或开关或跳线)对其进行控制。

ad = 0 bc = 0 -> FT232 <-> Arduino
ad = 0 bc = 1 -> FT232 <-> XBee
ad = 1 bc = 1 -> XBee <-> Arduino

您可以使用数字开关来代替多路复用器和多路解复用器(如果您能找到 4 开关 IC,您可以用它做任何事情)。

这是“完整”的解决方案。如果您可以容忍在 RX 引脚上“嗅探”另一个通信,则可以节省一个 IC:您在三个 RX 线上的每一个上放置一个连接到其他两个发送器的 2:1 多路复用器(所以 A- tx 和 F-tx 连接到 X-rx 等等)。通过控制这三个多路复用器,您可以选择要收听的人。

【讨论】:

【参考方案2】:

最终解决方案更加简单。移至具有多个 UART 的芯片。与仅选择另一个 MCU 相比,添加额外物理组件(也需要额外的电路板空间)的成本太高了。

【讨论】:

以上是关于用 arduino 切换 3 个双向通信通道的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

双向通信-Processing接收字符串

双向通信-Processing接收字符串

C ++ Boost TCP通道上的序列化对象,双向通信不起作用

Arduino ESP32 WIFI &蓝牙模式触控按键切换

Arduino GPRS模块的一些坑

arduino 和 Visual Studio C++,2 路串行通信