Answers:
如果我理解正确,您有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没有足够的驱动器,则可能需要插入一个缓冲器/驱动器以防止信号下降。
如果一次仅在一个方向上进行通信(即半双工通信),则可以做一个巧妙的技巧。如果双方在同一时间互相通话(全双工),这是行不通的,但是如果您是典型的“这样做”,“好的,这是响应”,“现在做的”,“好的,这是新的响应”通信类型它运作良好。
由于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:通过嗅探器上的一条UART和I / O线捕获的两个设备之间的半双工通信,而没有位撞击的UART通信。