Skip to content

시리얼 통신

병렬통신과 직렬통신

병렬통신(Parallel Communication)

  • 다수의 비트(bit)를 한번에 전송하는 방법이다. 이들은 보통 8 또는 16 또는 그 이상의 라인을 통해 동시에 데이터를 보냄
  • 타이밍(clock)에 맞춰 모든 라인이 같이 동작할 수 있도록 clock(CLK) 라인이 필요하므로 8-bit data bus의 경우 9라인을 사용한다.
  • 패러럴은 빠르고 상대적으로 구현이 쉽지만 input/output(I/O) 라인을 많이 소모한다.

직렬통신(Serial Communication)

  • 데이터를 스트림으로 바꿔서(직렬화, serialization) 한 번에 한 비트씩 전송한다.
  • 시리얼 인터페이스는 clock 라인 포함 2라인으로 데이터를 전송한다.

동기 시리얼과 비동기 시리얼

동기식 시리얼(Synchronous Serial)

  • 동기식 시리얼 인터페이스는 데이터 라인(data line)의 동작을 클럭 시그널(clock signal) 라인의 동작과 동기 실행한다.
  • 시리얼 버스에 함께 연결된 장치들이 이 클럭을 공유한다.
  • 직관적이고 종종 보다 빠르게 동작하지만 하나의 라인을 더 필요로 한다.
  • ex. SPI, I2C 프로토콜

비동기식 시리얼(Asynchronous Serial)

  • 데이터가 외부 클럭 시그널(external clock signal)의 도움없이 동작한다.
  • 데이터를 안정적으로 전송, 수신할 수 있도록 처리가 필요하다.
  • ex. RS323C, UART 통신

시리얼 동작 방식

Baud Rate (통신 속도)

  • 시리얼 라인으로 전송되는 데이터 속도, 초당 얼마나 많은 심볼(Symbol, 의미 있는 데이터 묶음)을 전송할 수 있는가를 나타낸다. 이론적인 통신 단위로 초당 신호(Signal) 요소의 수를 나타낸다.
  • Bits-per-second (bps) 단위로 표시
  • 이 값을 바탕으로 1 bit가 전송되는데 필요한 시간을 알 수 있다.
  • 1bit 데이터를 전송할 때 시리얼 라인을 high/low 상태로 유지하는 시간
  • 데이터를 받기 위해 시리얼 라인을 체크하는 시간
  • 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200을 주로 사용
  • 값이 높을수록 전송/수신 속도가 빠르지만 Baud rate 값이 너무 높거나 양쪽의 설정값이 틀릴 경우 데이터 수신에 문제가 발생한다.

Framing the data (데이터 구조)

  • 전송에 사용되는 데이터 패킷은 아래와 같이 구성된다.

  • 각각의 구성요소는 Start bit를 제외하고 가변적인 크기를 가질 수 있다.

Data chunk (데이터 영역)

  • 실제 전송할 데이터
  • 5~9 bit 를 사용할 수 있는데 8 bit가 기본이긴 하지만 다른 사이즈를 가질수도 있다.
  • 데이터 크기가 설정되면 데이터의 엔디안 처리에 대해서도 송신, 수신측에서 합의가 되어야 한다.

Synchronization bits (동기화 비트)

  • 2개 혹은 3개의 특수한 비트로 전송되는 데이터 패킷의 시작과 끝을 알린다. start bit, stop bit가 해당한다.
  • Start bit 는 1 bit, stop bit 는 1~2 bit 로 설정할 수 있다(일반적으로 stop bit는 1bit를 사용)
  • Start bit 는 idle 상태(데이터 전송이 없는 상태)에서 active 상태로의 변화(1–>0)로 표시되며 stop 비트는 반대로 idle 상태로 변화함(1)을 의미한다.

Parity bits (패리티 비트)

  • 매우 단순한 저레벨 에러 보정 방법으로 홀수 또는 짝수(odd or even)로 체크한다.

데이터 예시

9600 8N1
  • 9600 통신속도(baud rates), 8 data bits, no parity, and 1 stop bit
  • ‘O’(01001111),’K’(01001011)를 보낼때 아래와 같은 그림의 2개의 패킷이 만들어져서 전송된다. (LSB First)
  • 9600 bps 속도로 보내므로 각 비트는 1/(9600 bps) = 104 µs 시간에 보내진다. 1byte = 8bit 전송할 때 start bit, stop bit가 더해져서 10bit 패킷을 사용하므로 초당 960 byte 를 전송할 수 있다.

시리얼 입력 처리 방법

  • 아래의 두가지 입력 모드는 동기 방식이나 비동기 방식으로 사용될 수 있다.
  • 동기 방식은 read의 조건이 만족될 때까지 block되는 방식이다. 보통 동기 방식이 디폴트값이다.
  • 비동기 방식에서는 read() 함수가 바로 리턴되며, 호출한 프로그램에게 signal을 보낸다.

정규 입력 처리(Canonical Input Processing)

  • Canonical 입력 처리는 터미널의 기본 처리 방법
  • NL(NewLine, ASCII는 LF)문자, EOF(End of File)문자, 혹은 EOL(End Of Line)에 의해 종료되는 문자열, 즉 한 줄 단위로 전송한다.
  • CR(Carriage Return, DOS/Windows의 디폴트 EOL 문자임) 문자는 디폴트 세팅에서 한 줄의 종료 문자로 인식되지 않는다.
  • Canonical 입력 처리모드에서는 ERASE, DELETE WORD, REPRINT CHARACTERS 문자들을 처리할 수 있고, CR 문자를 NL 문자로 변환 처리할 수 있다.

비정규 입력 처리(Non-Canonical Input Processing)

  • 한 번 읽을 때마다 정해진 크기의 문자만을 읽어 낼 수 있다. 즉, 줄에 상관없이 특정 크기로 전송한다.
  • 타이머를 두어서 일정 시간까지 read()가 리턴하지 않는 경우 강제 리턴을 할 수 있음 이 모드는 항상 정해진 크기의 문자들만을 읽어내거나 대량의 문자들을 전송하고자 할 때 사용

참고