Jeśli dobrze rozumiem, masz 2 urządzenia podłączone przez UART. Zakładam tylko linie TX, RX i GND podłączone między urządzeniami? (tzn. nie zastosowano linii kontrolnych DTS / CTS / DTR / RTS - jest to typowe).
W tym scenariuszu urządzenie TX 1 (transmisja) jest podłączone do urządzenia RX urządzenia (odbiór) i na odwrót. Ich podstawy są ze sobą połączone. Zatem każde urządzenie może jednocześnie nadawać i odbierać (każde przesyła osobnym przewodem, komunikacja jest w trybie pełnego dupleksu).
Powodem, dla którego wspominam o tym wszystkim, jest to, że staje się jasne, że aby „wąchać” lub „słuchać”, faktycznie potrzebujesz 2 UART, aby słuchać obu stron rozmowy.
Zasadniczo wystarczy upewnić się, że masy UART wszystkich 3 urządzeń są zwarte, i połączyć (naprawdę „trójnik”, jak w trójniku, jak hydraulika) urządzenie 1 i linie TX urządzenia 2 z 2 liniami RX na 2 UARTach. Upewnij się, że wszystkie prędkości transmisji są skonfigurowane identycznie.
Istnieje wiele płyt / wzorów Arduino. Najpopularniejszy obecnie, Duemilanove, używa ATMega328P, który, jak sądzę, ma tylko 1 UART (no, USART). Będziesz musiał albo podłączyć drugi UART IC, albo zastosować „bit banging” na drugim odbiorniku.
Asynchroniczna komunikacja UART jest dobrze zdefiniowana, z bitami start i stop (a czasami bitami parzystości), więc jeśli twój procesor jest wystarczająco szybki, możesz po prostu podłączyć jedną z linii UART TX urządzenia do GPIO skonfigurowanego jako wejście i odpytać linię wystarczająco szybko z oversamplingiem, aby wykryć START & STOP i próbki bitów. Artykuł „Bit Banging” Jacka Ganssle'a da ci wiele do żucia.
Przyzwoity opis przebiegu RS232 można znaleźć w BeyondLogic .
Należy pamiętać, że istnieją inne problemy, takie jak poziomy napięcia (0 / + 5, -10 V / + 10 V itp.), Które należy wziąć pod uwagę (patrz sekcja Beyond Logic w „Konwerterach poziomu RS232”). Nie mam wystarczających informacji w twoim systemie, aby omówić interfejs sprzętowy oprócz omówionego powyżej podejścia „połącz linie”. Zakładając, że poziomy napięcia są dopasowane, zwykle nie jest problemem „przełączyć” linię TX do drugiego odbiornika (sniffera), ale jeśli TX nie ma wystarczającej ilości napędu, może być konieczne włożenie bufora / sterownika, aby zapobiec sygnał z degradacji.
Istnieje fajna sztuczka, którą możesz zrobić, jeśli komunikacja odbywa się tylko w jednym kierunku (tj. Komunikacja półdupleksowa). Nie zadziała, jeśli obie strony będą ze sobą rozmawiać w tym samym czasie (pełny dupleks), ale jeśli jest to typowe „zrób to” „ok, oto odpowiedź” „teraz zrób to” „ok, oto nowy rodzaj odpowiedzi” działa całkiem dobrze.
Ponieważ łącze UART wykorzystuje stan bezczynności nadajnika na wysokim poziomie logicznym (1), użyłbyś bramki AND z 2 wejściami i łączy TX z każdej strony z wejściem AND. Wyjście bramki AND jest Twoim wejściem do UART twojego sniffera (jest to pin RX). Teraz weź linię TX urządzenia B, a także przenieś ją do portu we / wy w snifferze. Sniffer skonfigurujesz tak, aby generował przerwanie, gdy ten pin zmieni się z wysokiego na niski.
Podsumowując: urządzenie A UART TX -> AND bramka wejściowa. Urządzenie B UART TX -> inne ORAZ wejście bramki ORAZ sniffer pin GPIO. Wyjście bramki AND -> sniffer linii UART RX.
Komunikacja UART składa się z bitu początkowego, pewnej liczby bitów danych, opcjonalnego bitu parzystości i jednego lub więcej bitów stopu. Ponieważ stan bezczynności jest wysokim poziomem logicznym (1), początek KAŻDEGO bajtu będzie miał niski poziom logiczny (0), a przerwanie na snifferze zostanie uruchomione. Podczas gdy Twój sniffer wykonuje przerwanie we / wy, sprzęt UART będzie zbierał bity z bramki AND. Zanim UART otrzyma bit stopu, przerwanie we / wy będzie długo trwało, a przerwanie UART RX zadziała.
Procedura zmiany przerwania przy IO ustawi zmienną „kierunek”, aby wskazać, że komunikacja odbywa się w kierunku „B-> A”. Przerwanie odbierania UART sniffera spojrzy na tę zmienną „kierunek” i zapisze właśnie odebrany bajt do odpowiedniego bufora. Przerwanie UART RX przywróciłoby wówczas zmienną „direction” powrót do domyślnego stanu „A-> B”:
Ten kod został napisany dla zachowania przejrzystości i niekoniecznie tego, co napisałbyś w rzeczywistej sytuacji. Osobiście uczyniłbym „kierunek” wskaźnikiem odpowiedniej struktury FIFO, ale to zupełnie inne ćwiczenie. :-)
Gdy urządzenie A mówi, linia we / wy nie porusza się (pozostaje na logicznym „1”, ponieważ nadajnik UART urządzenia B jest bezczynny), a przerwanie UART RX otrzyma bajt, sprawdź, czy kierunek to A-> B i przechowuj dane w tym buforze. Gdy urządzenie B mówi, linia we / wy obniży się, gdy tylko urządzenie B zacznie wysyłać dane, a procedura przerwania we / wy ustawi kierunek wskazujący, że urządzenie B mówi. Przerwanie UART RX ostatecznie uruchomi się po zebraniu wszystkich bitów, a ponieważ przerwanie We / Wy zajęło się odpowiednim ustawieniem rejestru kierunku, odebrany bajt zostanie zapisany w odpowiednim buforze.
Presto: komunikacja w trybie półdupleksu między dwoma urządzeniami przechwyconymi za pomocą pojedynczej linii UART i linii we / wy w węźle podsłuchowym, bez komunikacji UART w postaci bitów.
źródło
Nie musisz podpinać pinu transmisji danych AVR do swojego obwodu. Po prostu podłącz linię odbiorczą do połowy istniejącego łącza, na którym chcesz podsłuchiwać. Jeśli twój AVR ma dwa porty szeregowe, powinieneś mieć możliwość szpiegowania obu połówek istniejącego łącza jednocześnie. Musisz tylko dopasować ustawienia portu do istniejącej prędkości transmisji, bitów stopu itp.
źródło