시리얼 통신 소프트웨어 실습 - 1. Python을 활용한 시리얼 통신 (pyserial 라이브러리)

2025. 2. 10. 16:00프로그래밍/시스템

1장: Python을 활용한 시리얼 통신 (pyserial 라이브러리)

Python을 사용하면 컴퓨터와 외부 장치(마이크로컨트롤러, 센서, 모듈 등) 간의 시리얼 통신을 쉽게 구현할 수 있습니다.
이를 위해 pyserial 라이브러리를 사용하면, RS-232 또는 RS-485를 지원하는 시리얼 포트를 통해 데이터를 송수신할 수 있습니다.

이번 장에서는 Python에서 pyserial을 활용하여 시리얼 포트를 열고 닫는 방법, 포트 설정, 데이터 송수신 코드 작성법을 학습합니다.


1. 시리얼 통신을 위한 Python 환경 설정

✅ Python과 pyserial 라이브러리란?

pyserialPython에서 시리얼 포트를 제어하는 라이브러리로,
RS-232, RS-485, USB-to-Serial 변환기를 통해 외부 장치와 데이터를 송수신할 수 있도록 도와줍니다.

📌 pyserial을 사용하면 다음을 쉽게 수행할 수 있습니다.

  • 시리얼 포트를 열고 닫기
  • Baud Rate(전송 속도) 설정
  • 데이터 송신 및 수신
  • Timeout 설정을 통한 데이터 읽기 제어

✅ pyserial 라이브러리 설치

pyserial 라이브러리를 설치하려면 pip 명령어를 사용합니다.

pip install pyserial

설치가 완료되었는지 확인하려면 다음 명령어를 실행합니다.

python -m serial.tools.list_ports

📌 현재 PC에 연결된 시리얼 포트 목록을 확인할 수 있습니다.
📌 포트 이름(예: COM3, /dev/ttyUSB0 등)이 출력되면 정상적으로 설치된 것입니다.


2. Python을 사용한 시리얼 포트 열기/닫기

✅ 시리얼 포트 열기

다음 코드는 시리얼 포트를 열고 닫는 기본적인 Python 코드입니다.

import serial  # pyserial 라이브러리 임포트

# 시리얼 포트 설정
ser = serial.Serial(
    port='COM3',      # Windows: COM3, Linux/Mac: '/dev/ttyUSB0'
    baudrate=9600,    # Baud Rate 설정 (통신 속도)
    timeout=1         # Timeout 설정 (1초 동안 데이터 없으면 종료)
)

print("시리얼 포트가 열렸습니다:", ser.is_open)  # 포트가 정상적으로 열렸는지 확인

# 포트 닫기
ser.close()
print("시리얼 포트가 닫혔습니다:", not ser.is_open)

📌 Windows에서는 "COM3", "COM4" 같은 포트명을 사용
📌 Linux 및 Mac에서는 "/dev/ttyUSB0" 또는 "/dev/ttyS0" 같은 포트명을 사용


3. 포트 설정, Baud Rate, Timeout 설정

✅ 주요 시리얼 포트 설정 옵션

설정  항목 설명
port 사용할 시리얼 포트 (예: 'COM3', '/dev/ttyUSB0')
baudrate 전송 속도 (예: 9600, 115200 bps)
timeout 데이터 읽기 대기 시간 (초 단위)
bytesize 데이터 비트 크기 (보통 serial.EIGHTBITS 사용)
parity 패리티 비트 설정 (serial.PARITY_NONE 기본값)
stopbits 정지 비트 설정 (serial.STOPBITS_ONE 기본값)

✅ 예제: 다양한 설정을 포함한 시리얼 포트 열기

ser = serial.Serial(
    port='/dev/ttyUSB0',  # Linux 기준, Windows는 'COM3'
    baudrate=115200,      # 빠른 데이터 전송
    timeout=2,            # 2초 동안 데이터가 없으면 종료
    bytesize=serial.EIGHTBITS,  # 데이터 비트 크기 (8비트)
    parity=serial.PARITY_NONE,  # 패리티 없음
    stopbits=serial.STOPBITS_ONE  # 정지 비트 1개
)

📌 Baud Rate는 반드시 송수신 장치에서 동일하게 설정해야 합니다.
📌 Timeout을 설정하지 않으면, ser.read()에서 무한 대기 상태가 될 수 있음.


4. 데이터 송수신 코드 작성

✅ Python을 통해 데이터 보내기 (write)

write() 함수를 사용하여 바이너리 데이터를 전송할 수 있습니다.

ser = serial.Serial('COM3', 9600, timeout=1)

# 문자열을 바이트로 변환하여 전송
ser.write(b'Hello, RS-485!\n')

# 포트 닫기
ser.close()

📌 write() 함수는 바이트 데이터(b'') 형식으로 전송해야 합니다.
📌 문자열을 바이트로 변환하려면 b'문자열' 또는 .encode() 사용 가능.


✅ 수신 데이터 읽기 (read)

read(), readline() 또는 read_until()을 사용하여 데이터를 읽을 수 있습니다.

📌 한 바이트씩 읽기

data = ser.read(1)  # 1바이트 읽기
print("수신된 데이터:", data)

📌 한 줄씩 읽기 (\n까지)

data = ser.readline()  # 개행 문자(\n)를 만날 때까지 읽기
print("수신된 데이터:", data.decode())  # 바이트 데이터를 문자열로 변환

📌 특정 길이만큼 데이터 읽기

data = ser.read(10)  # 10바이트 읽기
print("수신된 데이터:", data)

📌 바이트 데이터를 문자열로 변환하려면 .decode('utf-8')을 사용합니다.


5. 데이터 송·수신을 조합한 예제

✅ 송·수신을 반복하는 Python 코드

아래 코드는 Python을 통해 시리얼 데이터를 송·수신하는 기본적인 코드입니다.

import serial

# 시리얼 포트 설정
ser = serial.Serial('COM3', 9600, timeout=1)

try:
    while True:
        # 데이터 전송
        ser.write(b'Ping\n')
        print("데이터 송신: Ping")

        # 응답 데이터 수신
        response = ser.readline()
        if response:
            print("수신된 데이터:", response.decode().strip())

except KeyboardInterrupt:
    print("종료")

finally:
    ser.close()  # 포트 닫기

📌 송·수신을 반복하며, 응답이 있을 경우 출력하는 코드입니다.
📌 Ctrl + C를 누르면 종료됩니다.


📌 요약

pyserial 라이브러리를 사용하면 Python에서 시리얼 통신을 쉽게 제어 가능
시리얼 포트를 열고 닫을 때 Serial() 객체를 사용하며, 설정을 맞춰야 함
Baud Rate, Timeout 설정을 적절히 조정해야 정상적인 데이터 송수신이 가능
write()를 통해 데이터를 송신하고, read() 또는 readline()을 사용하여 데이터를 수신
Python을 이용하면 RS-232, RS-485 등 다양한 장비와 시리얼 통신을 손쉽게 구현할 수 있음


💡 다음 장 (2장: RS-232 / RS-485를 활용한 데이터 송수신 실습)에서는?

  • RS-232 및 RS-485를 사용하여 실제 데이터를 송수신하는 Python 코드 실습
  • USB-to-Serial 변환기, MAX485 모듈을 사용한 실습
  • 데이터 송신 후 응답을 받아 처리하는 코드 작성

이제 Python을 활용한 기본적인 시리얼 통신 코드를 이해했나요? 😊
더 보완하고 싶은 내용이 있으면 알려주세요! 🚀