2025. 2. 10. 16:00ㆍ프로그래밍/시스템
1장: Python을 활용한 시리얼 통신 (pyserial 라이브러리)
Python을 사용하면 컴퓨터와 외부 장치(마이크로컨트롤러, 센서, 모듈 등) 간의 시리얼 통신을 쉽게 구현할 수 있습니다.
이를 위해 pyserial 라이브러리를 사용하면, RS-232 또는 RS-485를 지원하는 시리얼 포트를 통해 데이터를 송수신할 수 있습니다.
이번 장에서는 Python에서 pyserial을 활용하여 시리얼 포트를 열고 닫는 방법, 포트 설정, 데이터 송수신 코드 작성법을 학습합니다.
1. 시리얼 통신을 위한 Python 환경 설정
✅ Python과 pyserial 라이브러리란?
pyserial은 Python에서 시리얼 포트를 제어하는 라이브러리로,
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을 활용한 기본적인 시리얼 통신 코드를 이해했나요? 😊
더 보완하고 싶은 내용이 있으면 알려주세요! 🚀
'프로그래밍 > 시스템' 카테고리의 다른 글
시리얼 통신 소프트웨어 실습 - 3. 아두이노 및 라즈베리파이와 시리얼 통신하기 (0) | 2025.02.10 |
---|---|
시리얼 통신 소프트웨어 실습 - 2. RS-232 / RS-485를 활용한 데이터 송수신 실습 (0) | 2025.02.10 |
시리얼 통신 하드웨어 및 연결 실습 - 3. 송신(TX)과 수신(RX) 핀 개념 및 배선 실습 (0) | 2025.02.10 |
시리얼 통신 하드웨어 및 연결 실습 - 2. RS-485 모듈(MAX485)과 마이크로컨트롤러 연결 (0) | 2025.02.10 |
시리얼 통신 하드웨어 및 연결 실습 - 1. 시리얼 포트 개념 및 USB-to-Serial 변환기 이해 (0) | 2025.02.10 |