Arduino를 사용하여 두 장치 간의 UART 연결을 "스파이"할 수 있습니까?


11

기능을 향상 시키려면 Arduino (실제로는 IC)를 기존 하드웨어에 설치해야합니다.

내가하고 싶은 것은 Arduino를 연결하여 보드의 두 칩 사이의 I / O 라인에서 "스파이"되도록하는 것입니다. Arduino가 해당 UART 연결에서 특정 키워드를 선택하면 별도의 출력 핀 세트에서 특정 작업을 수행합니다.

내가 확실하지 않은 것은 참여하지 않고 기존 UART 연결을 디코딩 할 수있는 방법으로 Arduino를 연결하는 방법입니다. 가능하지 않다면 이론, 아이디어 등에 관심이 있습니다.

답변:


17

올바르게 이해하면 UART를 통해 2 개의 장치가 연결되어 있습니다. TX, RX 및 GND 회선 만 장치간에 연결되어 있다고 가정합니까? (즉, DTS / CTS / DTR / RTS 제어 라인이 사용되지 않습니다-이것이 일반적입니다).

이 시나리오에서 장치 1의 TX (전송)는 장치 2의 RX (수신)에 연결되며 그 반대도 마찬가지입니다. 그들의 근거는 서로 연결되어 있습니다. 따라서, 각각의 장치는 동시에 송수신 할 수있다 (각각 별도의 유선을 통해 전송하며, 통신은 전이 중이다).

내가이 모든 것을 언급 한 이유는 "스니핑"또는 "듣기"가 확실하기 때문에 대화의 양쪽을 들으려면 실제로 2 개의 UART가 필요하다는 것입니다.

기본적으로 3 개의 장치의 UART GND가 모두 단락되고 배관과 같은 T- 피팅과 같이 "실제로"티 "인 장치 1과 장치 2의 TX 회선을 2 개의 RX 회선에 연결하기 만하면됩니다. 2 개의 UART에. 전송 속도가 모두 동일하게 구성되어 있는지 확인하십시오.

Arduino 보드 / 디자인이 많이 있습니다. 요즘 가장 흔한 Duemilanove는 ATMega328P를 사용하는데 UART는 1 개뿐입니다. 따라서 두 번째 UART IC를 연결하거나 두 번째 수신기의 "비트 뱅킹"을 사용해야합니다.

비동기 UART 통신은 시작 및 중지 비트 (때로는 패리티 비트)와 함께 잘 정의되어 있으므로 프로세서가 충분히 빠르면 장치의 UART TX 회선 중 하나를 입력으로 구성된 GPIO에 연결하고 회선을 폴링 할 수 있습니다. 오버 샘플링으로 시작 및 중지 및 샘플 비트를 감지하기에 충분히 빠릅니다. Jack Ganssle의 "Bit Banging" 기사 는 씹을만한 내용을 많이 제공합니다.

RS232 파형에 대한 적절한 설명은 BeyondLogic 에서 확인할 수 있습니다 .

고려해야 할 전압 레벨 (0 / + 5, -10V / + 10V 등)과 같은 다른 문제가 있습니다 ( "RS232 레벨 컨버터"의 로직 이외의 섹션 참조). 위에서 설명한 "연결 연결"접근 외에 하드웨어 인터페이스에 대해 논의 할 시스템에 대한 정보가 충분하지 않습니다. 전압 레벨이 일치한다고 가정하면 일반적으로 TX 라인을 두 번째 수신기 (스니퍼)에 "티 (tee)"하는 것은 문제가되지 않지만 TX에 충분한 드라이브가없는 경우 버퍼 / 드라이버를 삽입해야합니다. 저하로부터의 신호.


아름다운! ATMega 칩의 단일 UART만으로도 데이터를 한 방향으로 만 이동하면됩니다! 두 칩은 +/- 5V UART와 통신하며 ATMega와 동일하다고 생각합니다. 와우, 그게 다야! 감사!
Brad Hein

@BradHein, "+/- 5V"라고 부르는 것을 일반적으로 "TTL 레벨"이라고합니다 ( en.wikipedia.org/wiki/Logic_level 참조) .
Mels

3
@Mels +/- 5V는 TTL이 아니며 TTL은 접지 ​​아래로 가지 않습니다. 이것은 RS-232입니다.
nmz787

9

통신이 한 번에 한 방향으로 만 이루어지는 경우 (예 : 반이중 통신) 깔끔한 트릭이 있습니다. 양측이 동시에 서로 대화하는 경우에는 작동하지 않지만 (전이중) 일반적인 "이것" "이것은 반응입니다" "지금은" ""새로운 반응은 여기 있습니다 " 꽤 잘 작동합니다.

UART 링크는 로직 하이 (1) 레벨에서 트랜스미터의 유휴 상태를 사용하므로 2- 입력 AND 게이트를 사용하여 각 측면에서 AND 입력으로 TX를 연결합니다. AND 게이트의 출력은 스니퍼의 UART (RX 핀)에 대한 입력입니다. 이제 장치 B의 TX 라인을 가져와 스니퍼의 I / O 포트로 가져옵니다. 이 핀이 높음에서 낮음으로 갈 때 인터럽트를 생성하도록 스니퍼를 구성합니다.

요약 : 장치 A UART TX-> AND 게이트 입력. 장치 B UART TX-> 기타 AND 게이트 입력 및 스니퍼 GPIO 핀. AND 게이트-> 스니퍼 UART RX 라인의 출력.

UART 통신은 시작 비트, 일부 데이터 비트, 선택적 패리티 비트 및 하나 이상의 정지 비트로 구성됩니다. 유휴 상태는 로직 하이 (1)이므로 모든 바이트의 시작은 로직 로우 (0)가되고 스니퍼의 인터럽트가 발생합니다. 스니퍼가 I / O 인터럽트를 실행하는 동안 UART 하드웨어는 AND 게이트에서 비트를 수집합니다. UART가 정지 비트를 수신 할 때까지 I / O 인터럽트가 오래 걸리고 UART RX 인터럽트가 발생합니다.

IO에서 인터럽트 변경 루틴은 "방향"변수를 설정하여 통신이 "B-> A"방향임을 나타냅니다. 스니퍼의 UART 수신 인터럽트는이 "방향"변수를보고 방금 수신 한 바이트를 적절한 버퍼에 씁니다. 그런 다음 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 통신 없음).


흥미로운. 이것은 내 이해의 한계를 뛰어 넘고 있지만 훌륭합니다! 내가 이해하지 못하는 부분은 스니퍼의 UART가 대상과 연결되어 양방향 통신 방향을 가로 챌 수있는 방법입니다. 여러 개의 I / O 핀을 사용할 수 있으므로이 방법을 사용하여 두 개의 I / O 핀을 사용하고 양방향 트래픽을 효과적으로 수집 할 수 있습니까?
Brad Hein

스니퍼 UART RX 라인은 AND 게이트의 출력에 연결됩니다. 장치 A의 UART TX는 AND 게이트의 한 입력에 연결되고 장치 B의 UART TX는 AND 게이트의 다른 입력에 연결됩니다. UART의 유휴 (트래픽 없음) 조건은 논리 '1'이므로 AND 게이트는 두 전송 신호를 하나로 결합합니다. 스니퍼의 I / O 라인은 장치 B의 시작 비트를 감지하여 UART에서 수신중인 바이트를 가져와 적절한 버퍼 (장치 A 트래픽 또는 장치 B 트래픽)에 넣을 수 있습니다.
akohlsmith

코드 조각과 AND 게이트의 배선을 통해 스니퍼는 단일 UART로 트래픽 흐름의 양방향을 기록 할 수 있습니다. 트래픽이 반이중 인 경우에만 작동합니다. 즉, 한 장치가 이야기 할 때 다른 장치가 듣고 있다는 것을 의미합니다. 둘 다 동시에 이야기하면 (전이중) 이것은 전혀 작동하지 않습니다.
akohlsmith

5

AVR의 전송 데이터 핀을 회로에 연결하지 않아도됩니다. 수신 라인을 도청하려는 기존 링크의 절반에 연결하십시오. 특정 AVR에 두 개의 직렬 포트가있는 경우 기존 링크의 양쪽 절반을 동시에 감시 할 수 있어야합니다. 포트 설정을 기존 전송 속도, 정지 비트 등과 일치시켜야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.