본문 바로가기
-----ETC-----/C++ 임베디드 시스템 프로그래밍 시리즈

[C++ 임베디드 시스템 프로그래밍 시리즈] Day 15: 직렬 통신 (UART)

by cogito21_cpp 2024. 8. 1.
반응형

직렬 통신 (UART)의 개요

UART(Universal Asynchronous Receiver/Transmitter)는 직렬 통신의 한 형태로, 임베디드 시스템에서 널리 사용되는 통신 방식입니다. UART를 사용하면 마이크로컨트롤러 간의 데이터 송수신이 가능합니다. 오늘은 UART의 기본 개념과 사용 방법을 학습하겠습니다.

1. UART의 기본 개념

UART는 비동기식 직렬 통신 방식으로, 두 개의 데이터 라인(TX, RX)을 사용하여 데이터를 송수신합니다. 일반적으로 UART는 다음과 같은 특성을 가집니다.

  • 비동기 통신: 송신기와 수신기 간에 클럭 신호가 필요 없습니다.
  • 시작 비트와 정지 비트: 데이터 프레임의 시작과 끝을 표시합니다.
  • 패리티 비트(Optional): 오류 검출을 위해 추가되는 비트입니다.

2. UART 설정

UART를 사용하려면 통신 속도(baud rate), 데이터 비트 수, 패리티 비트, 정지 비트 수 등을 설정해야 합니다. 일반적인 설정은 다음과 같습니다.

  • Baud rate: 9600
  • Data bits: 8
  • Parity: None
  • Stop bits: 1

3. UART 사용 예제

Arduino에서는 Serial 객체를 사용하여 UART 통신을 쉽게 구현할 수 있습니다.

 

예제: 기본적인 UART 통신

다음 예제는 UART를 사용하여 데이터를 송수신하는 방법을 보여줍니다.

void setup() {
    Serial.begin(9600); // 시리얼 통신 시작 (baud rate: 9600)
}

void loop() {
    if (Serial.available() > 0) { // 수신된 데이터가 있는지 확인
        char receivedChar = Serial.read(); // 수신된 데이터 읽기
        Serial.print("Received: ");
        Serial.println(receivedChar); // 수신된 데이터 출력
    }

    // 데이터를 송신
    Serial.println("Hello, UART!");
    delay(1000); // 1초 대기
}

 

위 코드에서는 Serial.begin 함수를 사용하여 시리얼 통신을 시작하고, Serial.read 함수를 사용하여 수신된 데이터를 읽습니다. Serial.println 함수를 사용하여 데이터를 송신하고, 수신된 데이터를 시리얼 모니터에 출력합니다.

 

4. 두 아두이노 간의 UART 통신

두 개의 Arduino 보드를 사용하여 UART 통신을 구현할 수 있습니다. 하나의 보드는 데이터를 송신하고, 다른 보드는 데이터를 수신합니다.

 

하드웨어 연결

  1. Arduino 1 (송신기):
    • TX 핀: Arduino 2의 RX 핀에 연결
    • GND: Arduino 2의 GND에 연결
  2. Arduino 2 (수신기):
    • RX 핀: Arduino 1의 TX 핀에 연결
    • GND: Arduino 1의 GND에 연결

예제: 송신기 코드 (Arduino 1)

void setup() {
    Serial.begin(9600); // 시리얼 통신 시작 (baud rate: 9600)
}

void loop() {
    Serial.println("Hello from Arduino 1!"); // 데이터 송신
    delay(1000); // 1초 대기
}

 

예제: 수신기 코드 (Arduino 2)

void setup() {
    Serial.begin(9600); // 시리얼 통신 시작 (baud rate: 9600)
}

void loop() {
    if (Serial.available() > 0) { // 수신된 데이터가 있는지 확인
        String receivedData = Serial.readString(); // 수신된 데이터 읽기
        Serial.print("Received: ");
        Serial.println(receivedData); // 수신된 데이터 출력
    }
}

 

위 코드에서는 첫 번째 Arduino 보드가 문자열 데이터를 송신하고, 두 번째 Arduino 보드가 데이터를 수신하여 시리얼 모니터에 출력합니다.

 

5. 소프트웨어 시리얼

Arduino 보드의 하드웨어 시리얼 포트가 부족한 경우, 소프트웨어 시리얼을 사용할 수 있습니다. SoftwareSerial 라이브러리를 사용하면 추가적인 시리얼 포트를 생성할 수 있습니다.

 

예제: 소프트웨어 시리얼 사용

다음 예제는 SoftwareSerial 라이브러리를 사용하여 소프트웨어 시리얼 포트를 생성하고 데이터를 송수신하는 방법을 보여줍니다.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX 핀 설정

void setup() {
    Serial.begin(9600); // 기본 시리얼 포트 시작
    mySerial.begin(9600); // 소프트웨어 시리얼 포트 시작
}

void loop() {
    if (mySerial.available() > 0) { // 소프트웨어 시리얼 포트에서 수신된 데이터가 있는지 확인
        char receivedChar = mySerial.read(); // 수신된 데이터 읽기
        Serial.print("Received from SoftwareSerial: ");
        Serial.println(receivedChar); // 수신된 데이터 출력
    }

    // 소프트웨어 시리얼 포트를 통해 데이터를 송신
    mySerial.println("Hello, SoftwareSerial!");
    delay(1000); // 1초 대기
}

 

위 코드에서는 SoftwareSerial 라이브러리를 사용하여 추가적인 시리얼 포트를 생성하고, 데이터를 송수신합니다.

 

마무리

오늘은 UART를 사용하여 직렬 통신을 구현하는 방법을 학습했습니다. 기본적인 UART 통신, 두 아두이노 간의 통신, 소프트웨어 시리얼을 사용한 통신 방법을 익혔습니다. 다음 날에는 I2C 통신에 대해 더 깊이 알아보겠습니다.

질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요.

Day 16 예고

다음 날은 "I2C 통신"에 대해 다룰 것입니다. I2C 통신을 사용하여 여러 장치 간의 데이터 송수신 방법을 학습하고, 실습 예제를 통해 이해를 돕겠습니다.

반응형