Arduino, iki cihaz arasındaki UART bağlantısında “casusluk yapmak” için kullanılabilir mi?


11

İşlevselliği artırmak için mevcut donanıma bir Arduino (aslında sadece IC) yüklemeye ihtiyacım var.

Yapmak istediğim Arduino'yu bağlamak, böylece tahtadaki iki yonga arasındaki G / Ç hatlarında "casus" yapmak. Arduino, bu UART bağlantısında belirli bir anahtar kelime alırsa, ayrı bir çıkış iğnesi seti üzerinde belirli bir eylem gerçekleştirir.

Belirsiz olduğum şey, Arduino'yu mevcut bir UART bağlantısına katılmadan deşifre edebilecek şekilde nasıl bağlayacağım? Mümkünse teoriler, fikirler vb. İle ilgileniyorum.

Yanıtlar:


17

Doğru anlıyorsam UART üzerinden bağlı 2 cihazınız var. Cihazlar arasında sadece TX, RX ve GND hatlarının bağlı olduğunu varsayıyorum? (yani DTS / CTS / DTR / RTS kontrol hatları kullanılmaz - bu tipiktir).

Bu senaryoda, aygıt 1'in TX (iletimi) aygıt 2'nin RX'e (alma) bağlanır ve bunun tersi de geçerlidir. Gerekçeleri birbirine bağlıdır. Böylece, her cihaz aynı anda iletim ve alım yapabilir (her biri ayrı bir kablo üzerinden iletir, iletişim tam çift yönlüdür).

Tüm bunlardan bahsetmemin nedeni, "koklamak" veya "dinlemek" için konuşmanın her iki tarafını da dinlemek için aslında 2 UART'a ihtiyacınız olacağıdır.

Temel olarak, tek yapmanız gereken 3 cihazın tüm UART GND'lerinin kısaltılmasını sağlamak ve (1, tesisat gibi T bağlantı elemanlarında olduğu gibi "tee") cihaz 1 ve cihaz 2'nin TX hatlarını 2 RX hattına bağlamak 2 UART üzerinde. Baud hızlarının hepsinin aynı şekilde yapılandırıldığından emin olun.

Bir sürü Arduino kartı / tasarımı var. Bugünlerde en yaygın olanı, Duemilanove, sadece 1 UART'a sahip olduğunu düşündüğüm ATMega328P'yi kullanıyor (iyi, USART). Böylece ya bir 2. UART IC'yi bağlamanız ya da ikinci alıcıda "bit vuruşu" na başvurmanız gerekir.

Async UART iletişimleri, başlangıç ​​ve bitiş bitleriyle (ve bazen eşlik bitleriyle) iyi tanımlanmıştır, bu nedenle işlemciniz yeterince hızlıysa, cihazın UART TX hatlarından birini giriş olarak yapılandırılmış bir GPIO'ya bağlayabilir ve hattı yoklayabilirsiniz. BAŞLAT ve DURDUR ve örnek bitlerini algılamak için aşırı örnekleme ile yeterince hızlı. Jack Ganssle'nin "Bit Banging" makalesi size bolca çiğnemenizi sağlayacak.

BeyondLogic'te RS232 dalga formunun iyi bir açıklaması bulunabilir .

Dikkate almanız gereken voltaj seviyeleri (0 / + 5, -10V / + 10V, vb.) Gibi başka sorunların da olduğunu unutmayın ("RS232 Seviye Dönüştürücüler" bölümündeki Mantık Ötesinde bölümüne bakın). Sisteminizde, yukarıda tartışılan "hatları bağlayın" yaklaşımının yanı sıra donanım arabirimini tartışmak için yeterli bilgim yok. Voltaj seviyelerinin eşleştiği varsayılırsa, genellikle TX hattını ikinci bir alıcıya (sniffer) "çekmek" bir sorun değildir, ancak TX'in yeterli sürücüsü yoksa, önlemek için bir tampon / sürücü takmanız gerekebilir. bozulma sinyali.


Güzel! ATMega çipindeki tek UART'ın yeterli olması için sadece bir yönde seyahat eden verilere ihtiyacım olacak! İki çip, ATMega ile aynı olduğunu düşünüyorum +/- 5V UART ile iletişim kurar. Vay be, bu olmalı! Teşekkürler!
Brad Hein

@BradHein, "+/- 5V" olarak adlandırdığınız şeye genellikle "TTL düzeyi" denir - bkz. En.wikipedia.org/wiki/Logic_level .
Ağustos'ta Mels

3
@Mels +/- 5V TTL DEĞİLDİR, TTL Yerin altına DEĞİLDİR. Bu RS-232.
nmz787

9

İletişim bir kerede bir yönde ise (yani yarı çift yönlü iletişim) yapabileceğiniz düzgün bir hile vardır. Her iki taraf da aynı anda (tam dubleks) konuşursa işe yaramaz, ancak tipik "bunu yap" "tamam işte yanıt" "şimdi bunu yap" "tamam işte yeni yanıt" iletişim türü oldukça iyi çalışıyor.

UART bağlantısı lojik yüksek (1) seviyede vericinin boşta durumunu kullandığından, 2 girişli bir AND geçidi kullanır ve TX'i her iki taraftan bir AND girişine bağlarsınız. AND geçidinin çıkışı, dinleyicinizin UART'ına (RX pinidir) girişinizdir. Şimdi cihaz B'nin TX hattını alın ve ayrıca sniffer üzerindeki bir G / Ç bağlantı noktasına getirin. Sniffer'ı, bu pim yüksekten düşüğe doğru bir kesme oluşturacak şekilde yapılandıracaksınız.

Özetlemek gerekirse: cihaz A UART TX -> AND geçit girişi. Cihaz B UART TX -> diğer AND geçidi girişi VE sniffer GPIO pimi. AND geçidi -> sniffer UART RX hattının çıkışı.

UART iletişimleri bir başlangıç ​​biti, bazı sayıda veri biti, isteğe bağlı eşlik biti ve bir veya daha fazla durdurma bitinden oluşur. Rölanti durumu bir mantık yüksek (1) olduğundan, HER baytın başlangıcı bir mantık düşük (0) olacaktır ve dinleyicinin kesilmesi tetiklenir. Sniffer I / O kesintisini yürütürken, UART donanımı AND geçidinden bitler toplayacaktır. UART durdurma bitini aldığında, G / Ç kesmesi uzun sürecek ve UART RX kesmesi tetiklenecektir.

IO-değişim kesintisi rutini, iletişimin "B-> A" yönünde olduğunu göstermek için bir "yön" değişkeni ayarlayacaktır. Sniffer'ın UART alma kesmesi bu "yön" değişkenine bakar ve yeni alınan baytı uygun tampona yazar. UART RX kesmesi, "yön" değişkenini varsayılan "A-> B" durumuna geri döndürür:

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 */
}

Bu kod, açık bir şekilde yazılmıştır ve gerçek dünyadaki bir durumda yazacağınız şey değildir. Şahsen uygun FIFO yapısına bir "yön" gösterirdim, ama bu tamamen başka bir alıştırma. :-)

A cihazı konuşurken G / Ç hattı hareket etmiyor (cihaz B'nin UART vericisi boşta olduğu için '1' mantığında kalıyor) ve UART RX kesmesi bir bayt alacak, yönün A-> B olduğunu görün ve verileri bu arabelleğe depolar. B cihazı konuşurken, B cihazı veri kaydırmaya başlar başlamaz G / Ç hattı azalır ve G / Ç kesme rutini B cihazının konuştuğunu göstermek için yönü ayarlar. UART RX kesmesi sonunda tüm bitler toplandıktan sonra tetiklenir ve G / Ç kesmesi yön kaydının uygun şekilde ayarlanmasını sağladığından, alınan bayt doğru tamponda saklanır.

Presto: Snifferde tek bir UART ve G / Ç hattı ile yakalanan iki cihaz arasında, bitlerle vurulmuş UART iletişimi olmadan yarı çift yönlü iletişim.


İlgi çekici. Bu, anlayışlarımın sınırlarını zorluyor, ama harika! Anlamadığım bir bölüm, dinleyicinin UART'ın hedefe nasıl bağlandığını, böylece her iki iletişim yönünü de kesebileceğini mi? Kullanabileceğim birkaç G / Ç Pimi var, bu yüzden bu yöntemi kullanarak iki G / Ç Pini kullanabilir ve her iki trafiği de etkili bir şekilde toplayabilir miyim?
Brad Hein

Sniffer UART RX hattı AND geçidinin çıkışına bağlanır. A cihazının UART TX cihazı AND geçidinin bir girişine bağlanır ve B cihazının UART TX cihazı AND geçidinin diğer girişine bağlanır. Bir UART'ın boşta (trafik yok) koşulu bir mantık '1' olduğundan, AND geçidi her iki iletim sinyalini etkili bir şekilde birleştirir. Sniffer üzerindeki I / O hattı, B cihazının başlangıç ​​bitini saptamak için kullanılır, böylece UART'ta aldığı baytı alabilir ve uygun arabelleğe (cihaz A trafiği veya cihaz B trafiği) koyabilir.
akohlsmith

Kod parçası ve AND geçidinin kablo bağlantısı, algılayıcının trafik akışının her iki yönünü tek bir UART ile kaydetmesine izin verir. Bu SADECE trafik yarı çift yönlü ise çalışır. Bu, bir cihaz konuşurken diğerinin dinlediği anlamına gelir. Her ikisi de aynı anda konuşursa (tam çift yönlü), bu hiç işe yaramaz.
akohlsmith

5

AVR'nin iletim veri pinini devrenize takmanız gerekmez. Alma hattını, gizlice dinlemek istediğiniz mevcut bağlantının yarısına bağlayın. Belirli AVR'nizde iki seri bağlantı noktası varsa, mevcut bağlantının her iki yarısını aynı anda gözetlemeniz gerekir. Bağlantı noktası ayarlarını mevcut baud hızıyla, durdurma bitleriyle vb. Eşleştirmeniz yeterlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.