본문 바로가기

Arduino(아두이노)

#5 시리얼(Serial) 통신

아두이노 간 통신으로 비 동기식 방식인 UART(Universal Asynchronous Receiver/Transmitter)와 동기식 방식인 I2C(Inter-Intergrated Circuit), SPI(Serial Peripheral Interface)를 주로 사용합니다.


그중에서 아두이노의 가장 기본이 되는 통신은 UART 시리얼(Serial) 통신입니다. 아두이노 스케치를 컴파일한 후 아두이노 보드에 업로드할 때에도 이 시리얼 통신을 사용하게 됩니다. 아두이노와 아두이노 간의 연결, 아두이노와 컴퓨터 간의 연결 모두에 시리얼 통신을 사용할 수 있습니다.


이번 시간에는 아두이노와 컴퓨터 간의 시리얼 통신에 대해서 알아보도록 하겠습니다. 이때 컴퓨터와의 통신에 사용되는 것은 아두이노 보드의 0번과 1번 핀입니다.



  • 0번 핀(RX: Receive Data) - 컴퓨터에서 보내는 신호를 받음
  • 1번 핀(TX: Transmit Data) - 컴퓨터로 신호를 보냄
중요!
  • 0번과 1번 핀은 USB to Serial 기능을 하는 칩과 연결되어 있어서 USB 케이블을 통해 아두이노와 컴퓨터 간에 데이터를 주고 받음
  • USB 케이블을 컴퓨터에 연결하지 않았을 경우에는 0번과 1번 핀을 다른 기기의 시리얼 통신 포트와 연결할 수 있음
  • 시리얼 통신을 사용하는 경우에는 0번과 1번 핀을 디지털 입출력으로 사용할 수 없음

그럼, 시리얼 통신이란 무엇일까요?

서로 다른 두 기기가 데이터를 주고 받기 위해 만들어진 통신 방법으로는 병렬(Parallel, 패러렐) 통신과 직렬(Serial, 시리얼) 통신이 있습니다. 



예를 들어 8비트 데이터를 전송한다고 할 때, 병렬 통신은 8개의 데이터 선을 사용하여 각각의 선에 한 비트씩 동시에 전송하는 방법입니다. 이에 반해 시리얼 통신은 하나의 데이터 선을 사용하여 한 비트씩 차례로 전송하는 방법 입니다.


전송 속도 면에서는 병렬 통신이 더 좋을 수 있으나 시리얼 통신은 더 멀리 보낼 수 있습니다. 그러므로 용도에 맞게 사용하게 됩니다.


아두이노와 컴퓨터 간의 데이터 전송은 UART 방식의 시리얼 통신을 사용하게 되는데 비동기식 통신 방식을 사용합니다. 동기식 시리얼 통신 방식인 I2C나 SPI 통신의 경우에는 데이터 수신 타이밍을 위해 Clock 라인을 사용하는 반면 비동기식인 UART 통신은 미리 약속된 통신 속도로 데이터를 전송해야 합니다.



  • 동기식 방식
    1. 데이터 신호화는 별도로 동기 신호(Clock 신호)를 함께 전송
    2. 한번에 여러 문자를 수용하는 데이터 블록 단위로 전송하는 방식
    3. 일반적으로 상당히 큰 데이터 블럭인 경우에는 동기식 전송방식이 더 좋은 성능을 가짐
    4. 정보통신에서 사용되는 대부분의 통신 프로토콜에서 이용
  • 비동기식 방식
    1. 데이터 신호만을 보내고 각각의 방식에 따라 데이터 비트를 찾아냄
    2. 보통 한 문자 단위와 같이 매우 작은 비트 블럭의 앞과 뒤에 Start 비트와 Stop 비트를 삽입하여 동기화하는 방식
    3. 일반적으로 비동기식 전송방식은 단순하고 저렴하나 각 문자당 Start 비트와 Stop 비트를 비롯해 2~3 비트의 오버헤드를 요구하므로 전송효울이 다소 떨어짐
    4. 보통 낮은 전송속도에서 이용

   시리얼 모니터(Serial Monitor)

아두이노와 컴퓨터간의 시리얼 통신은 시리얼 모니터를 사용합니다. 시리얼 모니터를 통해서 아두이노 보드의 센서 값을 확인하거나 아두이노 보드로 명령을 보낼 수 있습니다.


   "Hello World!" 컴퓨터에 출력하기



1. 통신 속도 설정하기

void begin(speed);
void begin(speed, config);
  • speed: 시리얼 통신 속도로 Baud Rate라고 하며 초당 전송되는 비트 수를 말합니다. 단위는 bsp(Bit Per Second)로 반드시 다음 값들 중 하나로 설정해야 합니다. 단, 보통 9600을 많이 사용합니다.
아두이노에서는 300 ~ 250000bps 까지 지원하지만, Serial 라이브러리에서는 115200bps 까지 지원하므로 115200bps 를 초과하지 않도록 주의할 것!
  • config: 시리얼 통신 환경(데이터 길이, 패리티 비트, 정지 비트)을 설정합니다. "SERIAL_" 뒤에 각각의 정보를 의미하는 문자를 붙입니다.

데이터 길이

8

 8비트 데이터

7

 7비트 데이터

6

 6비트 데이터

5

 5비트 데이터

패리티 비트

 패리티 비트 사용 안 함

E

 짝수(Even) 패리티 비트 사용

O

 홀수(Odd) 패리티 비트 사용

 정지 비트

1

 1개의 정지 비트 사용

2

 2개의 정지 비트 사용

 

config 값을 지정하지 않으면 기본으로 "SERIAL_8N1" 이 설정 → 이는 8비트 데이터에 패리티 비트는 사용하지 않고 1개의 정지 비트를 사용한다는 의미!!!



  • 아두이노 프로그램에서 설정한 통신 속도와 시리얼 모니터의 통신 속도는 반드시 일치 시켜야 합니다. 그렇지 않을 경우 다음 그림과 같은 문제가 발생하게 됩니다.

 


2. 데이터 출력하기


size_t Serial.print(data, format);

size_t Serial.println(data, format);

  • print() 함수: 시리얼 모니터로 데이터를 출력하는 함수
  • println() 함수: print() 함수와 동일하나 출력 이후 엔터키(\n)를 추가로 출력하는 함수
  • 매개변수
    1. data: 출력 값(char, char 배열, String, 정수, 실수 등)
    2. format: 출력 형식
  • 반환 값: 시리얼 포트로 출력된 바이트 수
Serial.println("Hello World!");
Serial.print("Hello ");
Serial.println("World!");
는 동일한 결과를 보여줍니다.


   컴퓨터에서 아두이노로 데이터 보내기



1. 수신된 데이터 확인하기


int Serial.available(void);

  • 시리얼 포트에 수신되어 저장되어 있는 데이터의 바이트 수를 반환하는 함수
  • 매개변수: 없음
  • 반환 값: 시리얼 포트 수신 데이터 버퍼에 저장된 데이터의 바이트 수
  • 데이터를 받지 않았다면 0을 반환
  • 시리얼 포트로 수신된 데이터는 64바이트까지 버퍼에 저장


2. 데이터 읽어오


int read(void);

  • 시리얼 통신의 수신 버퍼에서 첫번째 문자를 읽어 반환
  • 수신 버퍼가 비어 있으면 '-1'을 반환


3. 시리얼 통신 종료하기


void Serial.end(void);



※ 참고 사이트(Reference)


'Arduino(아두이노)' 카테고리의 다른 글

#4. 예제01 - LED 깜박이기  (0) 2018.04.10
#3. 아두이노 IDE(통합개발환경)  (0) 2018.03.28
#2. 아두이노 준비하기  (1) 2018.03.28
#1. 아두이노 둘러보기  (0) 2018.03.28