Arduino可以用来“侦听”两个设备之间的UART连接吗?


11

我需要在现有硬件中安装Arduino(实际上只是IC)以增强功能。

我想做的是连接Arduino,以便它在板上的两个芯片之间的I / O线上“监视”。如果Arduino在该UART连接上选择了特定的关键字,它将在另一组输出引脚上执行特定的操作。

我不确定的是如何以一种无需参与即可解码现有UART连接的方式连接Arduino?如果不可能,我会对理论,思想等感兴趣。

Answers:


17

如果我理解正确,您有2个设备通过UART连接。我假设设备之间仅连接了TX,RX和GND线?(即,不使用DTS / CTS / DTR / RTS控制线-这是典型的)。

在这种情况下,设备1的TX(发送)连接到设备2的RX(接收),反之亦然。它们的接地端相互连接。因此,每个设备可以同时发送和接收(每个设备在单独的电线上发送,通信是全双工的)。

我之所以提及所有这一切,是因为很明显,要“嗅探”或“监听”,实际上需要2个UART来侦听对话的双方。

基本上,您要做的就是确保所有3个设备的UART GND都短路,然后将设备1和设备2的TX线(确实是T型接头,例如管道)连接到2个RX线在2个UART上 确保所有波特率均配置相同。

有很多Arduino板/设计。当今最常见的型号是Duemilanove,它使用ATMega328P,我认为它只有1个UART(嗯,是USART)。因此,您要么必须连接第二个UART IC,要么在第二个接收器上求助于“位撞击”。

异步UART通信的定义很明确,带有开始和停止位(有时还包括奇偶校验位),因此,如果您的处理器足够快,则可以将设备的UART TX线之一连接到配置为输入的GPIO并进行轮询通过过采样可以足够快地检测START&STOP和采样位。Jack Ganssle的文章“ Bit Banging”将给您带来很多启发

BeyondLogic上可以找到有关RS232波形的详细描述。

请注意,还必须考虑其他问题,例如电压电平(0 / + 5,-10V / + 10V等)(请参阅“ RS232电平转换器”的“超越逻辑”部分)。除了上面讨论的“连接线路”方法外,您的系统上没有足够的信息来讨论硬件接口。假设电压电平匹配,通常将TX线路“拉”入第二个接收器(嗅探器)就不是问题,但是如果TX没有足够的驱动器,则可能需要插入一个缓冲器/驱动器以防止信号下降。


美丽!我只需要沿一个方向传输数据,这样ATMega芯片上的单个UART就足够了!这两个芯片与+/- 5V UART通信,我认为与ATMega相同。哇,应该是这样!谢谢!
布莱德·海因

@BradHein,您所说的“ +/- 5V”通常称为“ TTL电平”-请参见en.wikipedia.org/wiki/Logic_level
梅尔斯,2013年

3
@Mels +/- 5V不是TTL,TTL不会低于地面。这是RS-232。
nmz787 2014年

9

如果一次仅在一个方向上进行通信(即半双工通信),则可以做一个巧妙的技巧。如果双方在同一时间互相通话(全双工),这是行不通的,但是如果您是典型的“这样做”,“好的,这是响应”,“现在做的”,“好的,这是新的响应”通信类型它运作良好。

由于UART链路以逻辑高(1)电平使用发送器的空闲状态,因此您将使用2输入与门,并将TX的每一侧都连接到与输入。AND门的输出是您到嗅探器的UART(它是RX引脚)的输入。现在,拿走设备B的TX线,并将它带到嗅探器上的I / O端口。您将配置嗅探器,使其在此引脚从高电平变为低电平时产生中断。

回顾一下:设备A UART TX-> AND门输入。设备B UART TX->其他AND门输入AND嗅探器GPIO引脚。AND门的输出->嗅探器UART RX线。

UART通信包括一个起始位,一些数据位,一个可选的奇偶校验位和一个或多个停止位。由于空闲状态为逻辑高电平(1),因此每个字节的开始都将为逻辑低电平(0),并且嗅探器上的中断将触发。当您的嗅探器执行I / O中断时,UART硬件将从AND门收集位。到UART接收到停止位时,I / O中断将长时间完成,并且UART RX中断将触发。

IO更改中断例程将设置一个“ direction”变量,以指示通信处于“ B-> A”方向。嗅探器的UART接收中断将查看此“ direction”变量,并将刚接收的字节写入适当的缓冲区。然后,UART RX中断会将“ direction”变量设置回默认的“ A-> B”状态:

volatile int direction = 0;           /* 0 = A -> B */

void io_interrupt(void)
{
    direction = 1;                    /* switch direction, now B -> A */
}

void uart_interrupt(void)
{
    unsigned char b;

    b = UART_RX_REG;
    if(direction) {
        store_byte_to_device_b_sniff_buffer(b);
    } else {
        store_byte_to_device_a_sniff_buffer(b);
    }

    direction = 0;                   /* reset direction to default A -> B */
}

编写此代码是为了清楚起见,不一定是您在现实情况下编写的代码。就我个人而言,我会将“方向”作为指向适当的FIFO结构的指针,但这完全是另一种练习。:-)

当设备A讲话时,I / O线不动(由于设备B的UART发送器处于空闲状态,因此它保持为逻辑1),并且UART RX中断将接收一个字节,请注意方向是A-> B ,并将数据存储到该缓冲区。当设备B在讲话时,一旦设备B开始移出数据,I / O线就会变低,并且I / O中断例程将设置指示设备B在讲话的方向。收集完所有位后,UART RX中断最终将触发,并且由于I / O中断已妥善设置方向寄存器,因此接收到的字节将存储在正确的缓冲区中。

Presto:通过嗅探器上的一条U​​ART和I / O线捕获的两个设备之间的半双工通信,而没有位撞击的UART通信。


有趣的。这正在推动我的理解极限,但是太好了!我不了解的一部分是,嗅探器的UART如何连接到目标,以便它可以拦截两个方向的通信?我有几个可用的I / O引脚,那么我可以使用这种方法使用两个I / O引脚并有效地收集两个方向的流量吗?
布莱德·海因

嗅探器UART RX线连接到AND门的输出。设备A的UART TX连接到AND门的一个输入,设备B的UART TX连接到AND门的另一输入。由于UART的空闲(无流量)状态为逻辑1,所以AND门有效地将两个发送信号组合为一个。嗅探器上的I / O线用于检测设备B的起始位,以便它可以接收其在UART上接收的字节并将其放入适当的缓冲区(设备A流量或设备B流量)中。
akohlsmith

代码片段和与门的接线使嗅探器可以通过单个UART记录两个方向的业务流。仅在流量为半双工时才有效。这意味着当一台设备在讲话时,另一台设备正在监听。如果两个人同时通话(全双工),则根本无法使用。
akohlsmith

5

您不必将AVR的发送数据引脚连接到电路中。只需将接收线连接到您想窃听的现有链接的一半即可。如果您的特定AVR具有两个串行端口,则您应该能够同时监视现有链路的两半。您只需要使端口设置与现有的波特率,停止位等匹配即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.