Serial 통신 - 1. UART, USART

haesoo·2024년 9월 22일

통신

목록 보기
1/2
post-thumbnail

'통신'은 기기와 기기 간 데이터를 주고 받는 것이다.
이 때 우리는 정해진 통신 규약에 기반하여 데이터를 주고 받아야 한다. 어떤 데이터 형식으로 주고 받을 지, 어떤 신호에 맞추어 주고 받을지, 언제 주고 언제 끝낼 지 등의 정말 다양한 정보들 .. 이를 담은 규칙이 프로토콜 (Protocol)이다.

통신의 대분류에는 직렬 통신 (Serial)병렬 통신 (Parallel)이 있다.

직렬 통신 (하단 그림)

  • 흔히들 시리얼 통신이라고 한다. 하나의 선으로 데이터를 순차적으로 보내는 방식이다. 당연히 병렬 통신보다 느릴 수밖에 없지만 그만큼 간단하고, 거리에 대한 제약이 없으며, 안정적이다.

병렬 통신 (상단 그림)

  • 우리가 알고 있는 데이터 버스 (Bus)가 이에 속한다. 여러 개의 채널에서 "동시에 여러 개의 데이터 신호"를 보낸다.
    잉? 그럼 당연히 병렬 통신이 빠르고 좋은 것 아냐? 라고 생각할 수 있지만, 많은 제약 사항이 존재한다. 속도 면에서는 효율적이지만, 채널 간의 간섭이 발생할 수 있다는 점, 그렇기에 장거리 통신이 불가능하다는 점, 결정적으로 비싸다는 점에서 덜 이용될 수밖에 없다. 임베디드는 저렴해야 한다..

우리가 많이 이용하는 시리얼 통신에는 어떤 것들이 있는지 차근차근 살펴볼 것이다. 그 중 오늘은 가장 기본적인 시리얼 통신인 UART / USART 통신에 대해 공부해보겠다!

컴퓨터 장치 관리자를 보면 COM Port가 있는데, 이걸로 UART 통신이 가능하다.

가령 mcu를 다루고 싶다면 uart to usb converter 와 rx, tx 핀을 연결한 다음, 
해당 컨버터에 micro 5 pin connector를 연결한다.
거기에 usb to 5 pin 케이블로 컴퓨터와 연결하면 된다. 
그러면 COM port로 mcu를 디버깅할 수 있다.

디버깅 하나 하는게 뭐가 이렇게 귀찮은지 .........
임베디드가 어려운 137293262번째 이유 같다 ........

UART (Universal Asynchronized Receiver/Transmitter)

uart와 usart의 가장 큰 차이점은 Asynchronized하냐 Synchronized하냐인데, UART는 async 즉, "비동기" 통신이라는 것.

동기 통신과 비동기 통신은 무슨 차이일까 ?!

동기 통신 : 보내는 쪽에서 데이터와 별개로 동기 신호 (클럭 신호)를 같이 보낸다. 
수신 측에서는 동기 신호에 맞추어 해당 데이터를 읽는다.
별도의 동기 신호가 필요하다는 것은 결국 또 "돈"과 직결됨.
빠르고 오류가 적지만 그만큼 **비싸다**

비동기 통신 : 보내는 쪽에서는 데이터만을 전송, 수신하는 쪽에서 이를 적절한 방식으로 읽어낸다. 
주로 통신 속도 (Baud Rate)만을 맞춰서 통신함
(데이터의 시작과 끝을 알아내는 등 ..)
언뜻 보면 불편을 감수하는 통신 같은데, 단일 신호로 쉽게 구성할 수 있다는 것과 저렴함이 강점.

그럼 이제 통신 과정을 간단하게 살펴보자.

UART 통신의 핵심. 별도의 Start Bit (St)와 Stop Bit (St)를 필요로 한다.
수신 측 기기가 신호를 읽을 때, idle 상태에서, Start Bit (항상 low 값)를 인식하면 이 때부터 데이터가 들어온다고 판단한다. 이후 0번부터 9번까지 데이터 비트로 해당 데이터를 수신하고, parity bit로 오류를 검출한다. 이후 Stop bit (항상 high 값)으로 데이터 전송의 끝을 알리면 다시 idle 상태로 돌아간다. 어찌보면 단순한 구조이다.

  • TX (Transmit)
  • RX (Receive)
  • GND (Ground)

송신에 TX 핀을 이용, 수신에 RX 핀을 이용함. 왼쪽 기기에서 TX핀으로 데이터를 보내면 오른쪽 기기는 RX핀과 연결되어 데이터를 읽는다. 단일 회선에서 이루어지는 통신이다.

BAUD RATE? 💨💨💨

Baud rate란, 초 당 보낼 수 있는 데이터의 양을 말한다. 초 당 보낼 수 있는 데이터 양이 클수록 data 하나 당 필요한 전송시간은 줄어든다. 일반적으로 UART 통신은 9600 ~ 115,200bps 의 데이터 전송 속도를 가진다.

Serial 통신에서 Baud rate = bps (bit per second) 와 동일하게 인식 (한 번에 하나의 비트를 처리)

송신과 수신에 이용되는 baud rate는 같아야 한다. (적어도 10% 오차 미만이어야 함) 누구 하나가 더 빠르거나 느리거나 차이 나면 데이터가 엉망으로 읽힌다.

USART (Universal Synchronized Receiver/Transmitter)

USART의 가장 큰 특징은 별도의 Clock 신호가 필요하다는 것이다.

동기 신호 (Clock)으로 데이터를 구분할 수 있기 때문에 start, stop bit가 필요하지 않다. 송신과 수신 측에서 클럭을 공유하기 때문에 타이밍 오류가 발생할 가능성도 거의 없으므로 parity bit도 필요하지 않다.

그렇기 때문에 똑같은 양의 데이터를 보낸다고 했을 때 uart 통신보다 보내는 데이터 프레임의 크기가 작다. -> 똑같은 시간 동안 더 많은 데이터를 보낼 수 있다. 더 빠르다.

같은 Baud Rate 로 보낸다고 가정할 때 USART 통신이 더 빠르고 안정적이지만 비용적인 면의 단점이 크다.

100이라는 10진수 데이터를 보내려고 한다. 일단 이진수로 바꾼다.
클럭의 Falling Edge 또는 Rising Edge에 맞추어 데이터를 보내며,
한 번의 클럭 주기에 맞춰서 비트를 송신한다.

USART는 UART에 비해 비싸고 장치 구성이 복잡하다.
그러나 또 다른 통신 프로토콜과 비교했을 때는 전력 효율이 좋고 구성이 단순하다고 볼 수 있기에 효용성이 있다.

그렇다면, CPU나 MCU가 신호를 송신하고 작업이 완료됨을 인지하거나, 수신 작업을 시작해야 함을 인식하는 방식은 무엇이 있을까?


Polling vs Interrupt

Polling ∞

polling은 하염 없이 기다린다.. 계속 주시한다.. 다른거 내팽개치고 그것만 한다..

하드웨어의 변화를 Loop 내에서 계 ~~ 속 읽어 들인다. 이벤트 수행 여부를 주기적으로 검사하다가,해당 신호를 받았을때 이벤트를 실행하는 방식이다.

  • 장점 : 간단한 구현, 통신 상태를 빠르게 확인
  • 단점 : 비효율적. 자원 낭비. 전력 소모가 큼

interrupt ☇

다른거 하다가 통신 핀에서 끝났다고 인터럽트 보내면 그 때 하러 온다.

장치나 이벤트가 발생했을 때 프로세서에게 직접 신호를 보내 작업을 처리하도록 하는 방식이다. 폴링과 달리 프로세서는 이벤트가 발생하기 전까지 다른 작업을 수행할 수 있으며, 이벤트가 발생했을 때만 인터럽트를 발생시켜서 해당 작업을 수행한다.

  • 장점 : 효율적 (CPU 자원의 낭비를 줄일 수 있다)
  • 단점 : 인터럽트 처리를 위한 예외 모드로의 전환, Context Switching 이 오버헤드가 될 수 있음. 구현의 복잡성. 인터럽트 우선 순위 등에 대한 고려..


컴퓨터 구조, 통신, 임베디드 시스템 등을 공부해보면, 절대 좋다! 라는 것은 없다. 모든 기법들은 전부 명확한 장단점을 가지기에, 적절한 S/W적 테크닉으로 각 기법에 대한 단점을 보완하는 선에서 활용하는 것이 좋은 것 같다.

나도 그런 멋찐 기술을 가진 개발자가 되고 싶다 .. .

다음 시간에는 I2C 통신에 대해 알아보게씁니다.

그럼 20000,, 일요일 Bye ,,

0개의 댓글