Fråga:
Kan Arduino användas för att "spionera" på en UART-anslutning mellan två enheter?
Brad Hein
2010-08-05 03:12:44 UTC
view on stackexchange narkive permalink

Jag behöver installera en Arduino (egentligen bara IC) i befintlig hårdvara för att förbättra funktionaliteten.

Vad jag skulle vilja göra är att ansluta Arduino så att den "spionerar" på I / O-linjerna mellan två marker på ett bräde. Om Arduino plockar upp ett specifikt nyckelord på den UART-anslutningen kommer den att utföra en specifik åtgärd på en separat uppsättning utgångsstift.

Vad jag är osäker på är hur man ansluter Arduino på ett sådant sätt att den kan avkoda en befintlig UART-anslutning utan att delta? Om det inte är möjligt är jag intresserad av teorier, idéer etc.

Tre svar:
Radian
2010-08-05 03:37:14 UTC
view on stackexchange narkive permalink

Om jag förstår rätt har du två enheter anslutna via UART. Jag antar att bara TX-, RX- och GND-linjer är anslutna mellan enheterna? (dvs inga DTS / CTS / DTR / RTS-kontrollinjer används - detta är typiskt).

I detta scenario är enhet 1: s TX (sändning) ansluten till enhet 2: s RX (mottagning) och vice tvärtom. Deras grunder är kopplade till varandra. Således kan varje enhet sända och ta emot samtidigt (var och en sänder på en separat tråd, kommunikationen är full-duplex).

Anledningen till att jag nämner allt detta är att det blir klart att " sniffa "eller" lyssna ", du behöver faktiskt två UARTs för att lyssna på båda sidor av konversationen.

I grund och botten är allt du skulle göra att se till att alla 3 enhets UART GND är kortslutna, och anslut (egentligen "tee", som i en T-koppling, som VVS) enhet 1 &-enhet 2: s TX-linjer till de 2 RX-linjerna på 2 UART. Se till att överföringshastigheterna alla är konfigurerade identiskt.

Det finns många Arduino-kort / mönster. Den vanligaste nuförtiden, Duemilanove, använder ATMega328P, som jag tror bara har 1 UART (ja, USART). Så du måste antingen koppla upp en andra UART-IC, eller använda "lite smäll" på den andra mottagaren.

Async UART-kommunikation är väldefinierad, med start &-stoppbitar (och ibland paritet bitar), så om din processor är tillräckligt snabb kan du helt enkelt ansluta en av enhetens UART TX-linjer till en GPIO som är konfigurerad som ingång, och undersöka linjen tillräckligt snabbt med översampling för att upptäcka START & STOPP och samplingsbitar. Artikeln "Bit Banging" av Jack Ganssle ger dig mycket att tugga på.

En anständig beskrivning av RS232-vågformen finns på BeyondLogic.

Observera att det finns andra problem som spänningsnivåer (0 / + 5, -10V / + 10V, etc.) som du måste ta hänsyn till (se avsnittet Beyond Logic om "RS232 nivåomvandlare") . Jag har inte tillräckligt med information om ditt system för att diskutera hårdvarugränssnitt förutom "connect the lines" -metoden som diskuterats ovan. Förutsatt att spänningsnivåerna matchas är det vanligtvis inte ett problem att "tappa" TX-linjen i en andra mottagare (snifferen), men om TX inte har tillräckligt med enhet kan du behöva sätta in en buffert / drivrutin för att förhindra signal från förnedrande.

Skön! Jag behöver bara data som reser i en riktning så den enda UART på ATMega-chipet räcker precis! De två chipsen kommunicerar med +/- 5V UART, vilket jag tycker är detsamma som ATMega. Wow, det borde vara det! Tack!
@BradHein, vad du kallar "+/- 5V" kallas vanligtvis "TTL-nivå" - se http://en.wikipedia.org/wiki/Logic_level.
@Mels +/- 5V är INTE TTL, TTL går INTE under marken.Detta är RS-232.
akohlsmith
2010-08-05 11:01:52 UTC
view on stackexchange narkive permalink

Det finns ett snyggt knep du kan göra om kommunikationen bara sker i en riktning åt gången (dvs. halv-duplexkommunikation). Det fungerar inte om båda sidor pratar med varandra samtidigt (full duplex) men om det är din typiska "gör detta" "ok här är svaret" "gör nu detta" "ok här är det nya svaret" typ av kommunikation det fungerar ganska bra.

Eftersom UART-länken använder sändarens viloläge på en logisk hög (1) nivå skulle du använda en 2-ingång OCH-grind och ansluta TX från varje sida till en AND inmatning. Utgången från AND-grinden är din ingång till din sniffer's UART (det är RX-stift). Ta nu enhet B: s TX-linje och ta den också till en I / O-port på snifferen. Du kommer att konfigurera sniffern så att den genererar ett avbrott när denna pin går från hög till låg.

För att sammanfatta: enhet A UART TX -> AND gate-ingång. Enhet B UART TX -> annan OCH-portingång OCH sniffer GPIO-stift. Utdata från AND gate -> sniffer UART RX-linje.

UART-kommunikation består av en startbit, ett visst antal databitar, en valfri paritetsbit och en eller flera stoppbitar. Eftersom tomgångstillståndet är en logisk hög (1), kommer början av ALLA byte att vara en logisk låg (0) och avbrottet på sniffern kommer att avfyras. Medan din sniffer utför I / O-avbrottet samlar UART-hårdvaran bitar från AND-grinden. När UART har tagit emot stoppbit kommer I / O-avbrottet att vara klart och UART RX-avbrottet kommer att utlösas.

Avbrott-vid-IO-ändringsrutinen kommer att sätta en "riktning" variabel för att indikera att kommunikationen är i "B-> A" -riktningen. Snifternas UART-mottagningsavbrott skulle titta på denna "riktnings" -variabel och skriva den just mottagna byten till lämplig buffert. UART RX-avbrottet skulle sedan sätta variabeln "riktning" tillbaka till standardläget "A-> B":

  flyktig int riktning = 0; / * 0 = A -> B * / void io_interrupt (void) {direction = 1; / * växla riktning, nu B -> A * /}
ogiltig uart_interrupt (ogiltig) {osignerad char b; b = UART_RX_REG; om (riktning) {store_byte_to_device_b_sniff_buffer (b); } annat {store_byte_to_device_a_sniff_buffer (b); } riktning = 0; / * återställ riktning till standard A -> B * /}  

Den här koden är skriven för tydlighet och inte nödvändigtvis vad du skulle skriva i en verklig situation. Personligen skulle jag göra "riktning" en pekare till lämplig FIFO-struktur, men det är en annan övning helt. :-)

När enhet A talar rör sig I / O-linjen inte (den förblir vid en logisk '1' eftersom enhet B: s UART-sändare är inaktiv) och UART RX-avbrottet kommer att få en byte , se att riktningen är A-> B och lagra data till den bufferten. När enhet B pratar kommer I / O-raden att bli låg så snart enhet B börjar flytta ut data och I / O-avbrottsrutinen ställer in riktningen för att indikera att enhet B pratar. UART RX-avbrottet kommer så småningom att avfyras efter att alla bitar har samlats in och eftersom I / O-avbrott har tagit hand om att ställa in riktningsregistret på rätt sätt kommer den mottagna byten att lagras i rätt buffert.

Presto: halv-duplexkommunikation mellan två enheter som fångats med en enda UART- och I / O-linje på sniffaren, utan UART-kommunikation med lite smäll.

Fängslande. Detta driver gränserna för mina förståelser, men det är fantastiskt! En del som jag inte förstår är hur snifferens UART är ansluten till målet så att den kan fånga upp båda riktningarna för kommunikation? Jag har flera I / O-pins tillgängliga, så kan jag bara använda två I / O-pins med den här metoden och effektivt samla in båda trafikriktningarna?
Sniffer UART RX-linjen är ansluten till utgången från AND-grinden. Enhets A: s UART TX är ansluten till en ingång på AND-grinden, och enhet B: s UART TX är ansluten till den andra ingången till AND-grinden. Eftersom en UART är inaktiv (ingen trafik) är en logisk '1', kombinerar AND-grinden effektivt båda sändningssignalerna till en. I / O-linjen på sniffern används för att detektera enhet B: s startbit så att den kan ta byten den tar emot på sin UART och placera den i lämplig buffert (enhet A-trafik eller enhet B-trafik).
Kodfragmentet och ledningarna till AND-grinden gör att sniffern kan spela in båda riktningarna för trafikflödet med en enda UART. Detta fungerar ENDAST om trafiken är halv duplex. Det betyder att när en enhet pratar lyssnar den andra. Om båda pratar samtidigt (full duplex) skulle det inte fungera alls.
JustJeff
2010-08-05 04:27:55 UTC
view on stackexchange narkive permalink

Du behöver inte ansluta AVR: s sändningsdatapinne i din krets. Anslut bara mottagningslinjen till hälften av den befintliga länken du vill avlyssna på. Om din speciella AVR har två seriella portar bör du kunna spionera på båda halvorna av den befintliga länken samtidigt. Du behöver bara göra att portinställningarna matchar den befintliga baudhastigheten, stoppbitar etc.



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 2.0-licensen som det distribueras under.
Loading...