아두이노 강좌 #15 시리얼 통신 포트 추가로 사용하기 SoftwareSerial.h
Lucy Archive
Lucy 2023
2020. 7. 14. 02:13

시리얼 포트가 부족할 때시리얼 포트가 부족할 때

SoftwareSerial.h 라이브러리 : 디지털 핀을 시리얼 포트로 사용

시리얼 포트는 디버깅, PC와 통신, 다른 CLCD, 블루투스 모듈, GPS 모듈등 다양한 곳에 연결하여 사용할 수 있습니다. 하지만, 아두이노 우노 보드의 경우 1개의 시리얼 포트만 존재해서 주변 기기 추가에 어려움이 있습니다. SoftwareSerial.h 라이브러리는 일반 디지털 핀을 시리얼 통신 포트로 사용할 수 있게 해주어, 주변 장치 추가가 가능합니다. 본 포스트에서는

시리얼 포트가 부족 할 때 SoftwareSerial 클래스를 사용하여 시리얼 통신 포트를 추가하는 방법과 예제

에 대해 작성하였습니다.

SoftwareSerial.h

[각주:1]SoftwareSerial 은 아두이노 보드의 디지털 핀을 시리얼 포트로 사용할 수 있게 해주를 라이브러리입니다. Arduino Uno 보드에는 기본적으로 1개의 시리얼 포트만 제공되지만, SoftwareSerial 라이브러리를 사용하여 시리얼 포트를  확장이 가능 합니다. 

아두이노 우노 시리얼 포트 확장아두이노 우노 시리얼 포트 확장

라이브러리 추가 방법

SoftwareSerial.h 은 아두이노 설치시 포함되어 있어, 별도의 라이브러리 설치 과정 없이 코드 선언 부에 #include <SoftwareSerial.h> 선언만 해주시면 됩니다.


SoftwareSerial 사용 방법

디지털 핀을 시리얼 통신 포트로 사용 하는 방법은 아래와 순서로 진행 하시면 됩니다.

  • 시리얼 포트 초기화 예시
    • SoftwareSerial mySerial(2,3) : RX 2번핀, TX 3번핀으로 사용하는 mySerial 객체 생성
    • mySerial.begin(9600) : mySerial 의 Buadrate 를 9600 으로 설정 후 시리얼 포트 활성화
  • 시리얼 출력 : 기존 Serial 클래스와 사용법 동일
    • mySerial.write() : 바이트 단위 데이터 출력
    • mySerial.print() : 문자열 출력
    • mySerial.println() : 개행문자가 포함된 문자열 출력
  • 시리얼 수신 : 기존 Serial 클래스와 사용법 동일
    • mySerial.available() : 시리얼 수신 버퍼에 데이터가 있는지 확인
    •  mySerial.read() : 시리얼 수신 데이터 1바이트를 읽고, 수신 버퍼에서 읽은 데이터를 지움

SoftwareSerial 클래스

Syntax

  • SoftwareSerial objectName(rxPin, txPin);

Parameters

  • objectName : 지정된 rxPin, txPin 의 시리얼 객체 이름
  • rxPin : RX 로 사용될 핀 번호
  • txPIN : TX 로 사용될 핀 번호

Returns : 반환 값 없음

Example

  • SoftwareSerial portOne(2,3) : 2(RX),3(TX)번 핀으로 시리얼 통신하는 portOne 객체 생성
  • SoftwareSerial portTwo(4,5) : 4(RX),5(TX)번 핀으로 시리얼 통신하는 protTwo 객체 생성

SoftwareSerial 써먹어보기

예제1 : SoftwareSerial 로 PC "Hello World!" 출력

SoftwareSerial 로 시리얼 포트 생성 후 1초 간격으로 "Hello World" 를 하는 코드 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<SoftwareSerial.h>
 
const int rxPin = 2;
const int txPin = 3;
 
SoftwareSerial mySerial(rxPin, txPin);
 
void setup(){
    mySerial.begin(9600);
}
 
void loop(){
    mySerial.println("Hello World!");
    delay(1000);
}
cs

SoftwareSerial로 PC와 시리얼 통신을 하기 위해서는 UART to USB 보드가 필요합니다. UART to USB 보드는 쇼핑사이트에서 UART to USB, CP2102, FT232R 등의 키워드를 검색하면 쉽게 찾으실 수 있습니다. 사용하시는 UART to USB 보드 바다 핀맵이 다르기 때문에 확인이 필요합니다. 아두이노의 TX는 변환보드의 RX, 아두이노의 RX는 변환보드의 TX에 연결되어야 합니다.

Arduino Uno 보드와 UART to USB 보드 연결Arduino Uno 보드와 UART to USB 보드 연결

예제1 프로그램 실행 결과는 아래와 같습니다. 시리얼 모니터 프로그램은 [각주:2]Hercules 를 사용하였습니다. 


예제2 : PC -> Software Serial -> Serial -> PC

아래 그림과 같이 PC에서 출력 된 데이터가 SoftwareSerial 포트와 Serial 포트를 거쳐 PC 로 되돌아 오는 프로그램입니다. 이 방법을 응용하여 UART로 AP명령을 하는 모듈 제어 및 디버깅이 가능합니다. 참고해주세요.

예제2 데이터 흐름예제2 데이터 흐름

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<SoftwareSerial.h>
 
const int rxPin = 2;
const int txPin = 3;
 
SoftwareSerial mySerial(rxPin, txPin);
 
int iReceiveData;
 
void setup(){
    Serial.begin(9600);
    mySerial.begin(9600);
    mySerial.println("Echo Program Start...\n");
}
 
void loop(){
    if(mySerial.available()>0){
        mySerial.write(mySerial.read());
    }
    if(Serial.available()>0){
        Serial.write(Serial.read());
    }
}
cs

예제2 회로 연결예제2 회로 연결

실행 결과

Hercules 프로그램의 Recieved/Sent Data 창에 보라색은 키보드를 입력하여 송신되는 데이터, 검은색은 시리얼 포트로 수신된 데이터 입니다.

SoftwareSerial 참고사항

SoftwareSerial.h 라이브러리는 디지털 핀을 소프트웨어 적으로 시리얼 통신이 가능 하도록 구현 하여 아래의 제약 사항이 있습니다. 프로그래밍에 참고해주세요.

  • SerialEvent() 와 같은 수신 인터럽트 지원하지 않음
  • 수신 인터럽트를 사용하기 위해 EXTI 인 2,3 번 핀에 RX 핀을 설정하여 별도로 구현 가능 함
  • 시리얼 포트를 여러개 사용하는 경우 한번에 하나의 시리얼 포트에서만 출력이 가능
  • Arduino Board 의 [각주:3]종류 별로 SoftwareSerial 사용 가능 핀이 정해져 있음

마무리

본 포스트에서 시리얼 포트를 추가하기 위해 SoftwareSerial.h 라이브러리 사용 방법과 예제에 대해 작성하였습니다. 
끝까지 읽어 주셔서 감사합니다.^^
관련포스트

👉 아두이노 시리얼 통신 관련글 목록 보기

👉 아두이노 전체 포스트 목록 보기 


  1. SoftwareSerial의 더 많은 정보 : https://www.arduino.cc/en/Reference/softwareSerial [본문으로]
  2. Hercules Utility Download : https://www.hw-group.com/software/hercules-setup-utility [본문으로]
  3. 아두이노 보드별 SoftwareSerial 사용가능핀 : https://www.arduino.cc/en/Reference/softwareSerial [본문으로]