Se bem entendi, você tem 2 dispositivos conectados via UART. Presumo apenas linhas TX, RX e GND conectadas entre os dispositivos? (ou seja, nenhuma linha de controle DTS / CTS / DTR / RTS usada - isso é típico).
Nesse cenário, o TX do dispositivo 1 (transmissão) está conectado ao RX do dispositivo 2 (recebimento) e vice-versa. Seus fundamentos estão conectados um ao outro. Assim, cada dispositivo pode transmitir e receber ao mesmo tempo (cada um transmite em um fio separado, a comunicação é full-duplex).
A razão de eu mencionar tudo isso é porque fica claro que, para "cheirar" ou "escutar", você realmente precisará de 2 UARTs para ouvir os dois lados da conversa.
Basicamente, tudo o que você faria é garantir que os UNDs dos GARTs de todos os três dispositivos estejam em curto e conecte (realmente, "tee", como em um encaixe em T, como um encanamento) as linhas TX do dispositivo 1 e do dispositivo 2 e as linhas TX do dispositivo 2 às 2 linhas RX em 2 UARTs. Verifique se as taxas de transmissão estão todas configuradas de forma idêntica.
Existem muitas placas / designs do Arduino. O mais comum atualmente, o Duemilanove, usa o ATMega328P, que acho que possui apenas 1 UART (bem, USART). Então, você teria que conectar um segundo UART IC ou recorrer a "batidas" no segundo receptor.
As comunicações assíncronas do UART são bem definidas, com bits de início e parada (e às vezes bits de paridade); portanto, se o seu processador for rápido o suficiente, você pode simplesmente conectar uma das linhas UART TX do dispositivo a um GPIO configurado como entrada e pesquisar a linha rápido o suficiente com oversampling para detectar START & STOP e amostras de bits. O artigo "Bit Banging" de Jack Ganssle lhe dará muito o que comentar.
Uma descrição decente da forma de onda RS232 pode ser encontrada no BeyondLogic .
Observe que existem outros problemas, como níveis de tensão (0 / + 5, -10V / + 10V, etc.) que você precisará levar em consideração (consulte a seção Além da lógica em "Conversores de nível RS232"). Não tenho informações suficientes em seu sistema para discutir a interface de hardware além da abordagem "conectar as linhas" discutida acima. Supondo que os níveis de tensão sejam compatíveis, geralmente não é um problema "colocar" a linha TX em um segundo receptor (o sniffer), mas se o TX não tiver unidade suficiente, talvez seja necessário inserir um buffer / driver para impedir sinal de degradação.
Há um truque interessante que você pode fazer se a comunicação estiver em uma direção apenas de cada vez (isto é, comunicação half-duplex). Não funcionará se os dois lados conversarem ao mesmo tempo (full duplex), mas se for o seu tipo típico de comunicação "faça isso" "ok, aqui está a resposta" "agora faça isso" "ok, aqui está a nova resposta" funciona muito bem.
Como o link UART usa uma condição ociosa do transmissor em um nível lógico alto (1), você usaria uma porta AND de 2 entradas e conectaria o TX de cada lado a uma entrada AND. A saída da porta AND é sua entrada para o UART do seu sniffer (é o pino RX). Agora pegue a linha TX do dispositivo B e leve-a para uma porta de E / S no sniffer. Você configurará o sniffer para gerar uma interrupção quando esse pino for de alto a baixo.
Para recapitular: entrada do dispositivo A UART TX -> AND gate. Dispositivo B UART TX -> outra entrada AND gate E pino do farejador GPIO. Saída da porta AND -> sniffer da linha UART RX.
As comunicações UART consistem em um bit inicial, algum número de bits de dados, um bit de paridade opcional e um ou mais bits de parada. Como o estado ocioso é uma lógica alta (1), o início de CADA byte será uma lógica baixa (0) e a interrupção no sniffer será acionada. Enquanto o seu sniffer estiver executando a interrupção de E / S, o hardware do UART coletará bits do portão AND. Quando o UART receber o bit de parada, a interrupção de E / S será realizada por muito tempo e a interrupção do UART RX será acionada.
A rotina de interrupção na troca de IO definirá uma variável "direction" para indicar que as comunicações estão na direção "B-> A". A interrupção de recebimento UART do sniffer examinaria essa variável "direction" e gravaria o byte recém-recebido no buffer apropriado. A interrupção do UART RX retornaria a variável "direction" ao estado "A-> B" padrão:
Esse código foi escrito para maior clareza e não necessariamente o que você escreveria em uma situação do mundo real. Pessoalmente, eu faria da "direção" um ponteiro para a estrutura FIFO apropriada, mas isso é outro exercício inteiramente. :-)
Quando o dispositivo A está falando, a linha de E / S não se move (permanece no lógico '1', pois o transmissor UART do dispositivo B está ocioso) e a interrupção do UART RX receberá um byte, veja se a direção é A-> B e armazene os dados nesse buffer. Quando o dispositivo B está falando, a linha de E / S fica baixa assim que o dispositivo B inicia a transferência de dados e a rotina de interrupção de E / S define a direção para indicar que o dispositivo B está falando. A interrupção do UART RX será acionada depois que todos os bits tiverem sido coletados e, como a interrupção de E / S cuidou de definir o registro de direção adequadamente, o byte recebido será armazenado no buffer correto.
Presto: comunicações half-duplex entre dois dispositivos capturados com uma única linha de UART e E / S no sniffer, sem comunicação UART.
fonte
Você não precisa conectar o pino de dados de transmissão do AVR ao seu circuito. Basta conectar a linha de recebimento à metade do link existente no qual você deseja escutar. Se o seu AVR específico tiver duas portas seriais, você poderá espionar as duas metades do link existente simultaneamente. Você só precisa fazer as configurações da porta corresponderem à taxa de transmissão, bits de parada etc.
fonte