2025. 2. 10. 16:01ㆍ프로그래밍/시스템
2장: RS-232 / RS-485를 활용한 데이터 송수신 실습
Python을 활용하여 RS-232 및 RS-485 통신을 실습하면,
PC에서 직접 시리얼 장치를 제어하고 데이터를 주고받는 방법을 익힐 수 있습니다.
이번 장에서는 USB-to-Serial 변환기를 이용한 RS-232 송수신과 MAX485 모듈을 활용한 RS-485 데이터 송수신을 실습합니다.
1. Python과 RS-232 시리얼 포트 통신 실습
✅ RS-232란?
RS-232는 1:1 직렬 통신 방식으로, PC와 외부 장치를 직접 연결하여 데이터를 주고받을 수 있습니다.
과거에는 PC의 COM 포트를 사용했지만, 현재는 USB-to-Serial 변환기를 이용하여 RS-232 통신을 수행합니다.
📌 RS-232 특징
- 비동기식(Asynchronous) 통신 방식
- TX(송신) ↔ RX(수신) 교차 연결 필요
- Baud Rate 설정 필수 (9600, 115200 등)
✅ USB-to-Serial 변환기를 이용한 RS-232 송수신
🔹 준비물
- USB-to-Serial 변환기 (FTDI, CP2102, CH340 등)
- RS-232 장치 (마이크로컨트롤러, 센서 등)
- 점퍼 와이어
📌 USB-to-Serial 변환기를 통한 연결 방식
[PC] USB → [USB-to-Serial 변환기] → [RS-232 장치 (TX ↔ RX)]
💡 RS-232 장치의 TX는 변환기의 RX와, RX는 TX에 교차 연결해야 합니다.
✅ Python을 사용하여 간단한 명령어 주고받기 (RS-232 실습)
Python을 사용하여 RS-232 장치에 명령어를 보내고 응답을 받는 코드를 작성합니다.
🔹 Python 코드 예제 (RS-232 데이터 송·수신)
import serial
# RS-232 시리얼 포트 설정
ser = serial.Serial(
port='COM3', # Windows: 'COM3', Linux/Mac: '/dev/ttyUSB0'
baudrate=9600, # Baud Rate 설정
timeout=1 # 1초 동안 데이터 없으면 종료
)
try:
while True:
# 명령어 전송
ser.write(b'GET_STATUS\n')
print("송신: GET_STATUS")
# 응답 수신
response = ser.readline().decode().strip()
if response:
print("수신:", response)
except KeyboardInterrupt:
print("종료")
finally:
ser.close() # 포트 닫기
📌 명령어('GET_STATUS\n')를 전송하고, 응답을 받는 코드입니다.
📌 Ctrl + C를 누르면 실행이 종료됩니다.
2. Python과 RS-485 통신 실습
✅ RS-485란?
RS-485는 멀티 드롭(Multi-Drop) 방식과 장거리(최대 1200m) 통신을 지원하는 직렬 통신 방식입니다.
RS-485 통신을 위해 MAX485 모듈을 사용하여 RS-485 신호를 TTL(UART) 신호로 변환해야 합니다.
📌 RS-485 특징
- 차동 신호(Differential Signal) 방식 사용 (A/B 선 활용)
- 멀티 드롭 지원 (최대 32개 장치 연결 가능)
- 반이중(Half-Duplex) 통신 (송신과 수신을 번갈아 수행해야 함)
✅ MAX485 모듈을 이용한 Python 기반 RS-485 데이터 송수신
🔹 준비물
- MAX485 모듈
- USB-to-Serial 변환기 (TTL-UART 변환 기능 포함된 것)
- 점퍼 와이어
📌 MAX485를 이용한 RS-485 통신 구성
[PC] USB → [USB-to-Serial 변환기] → [MAX485 모듈] → [RS-485 네트워크]
💡 RS-485는 A(+)와 B(-) 차동 신호를 사용하며, 모든 장치는 동일한 A/B 버스에 연결됩니다.
✅ Python을 사용한 RS-485 데이터 송수신 코드
RS-485에서는 DE/RE 핀을 제어하여 송신(TX)과 수신(RX)을 전환해야 합니다.
🔹 Python 코드 예제 (RS-485 데이터 송·수신)
import serial
import time
# RS-485 포트 설정
ser = serial.Serial(
port='COM4', # Windows: 'COM4', Linux/Mac: '/dev/ttyUSB0'
baudrate=9600, # Baud Rate 설정
timeout=1 # Timeout 설정
)
# 송신 모드 설정 (DE/RE 핀 HIGH)
def enable_tx():
ser.setDTR(True) # DTR 핀을 HIGH로 설정 (송신 모드)
# 수신 모드 설정 (DE/RE 핀 LOW)
def enable_rx():
ser.setDTR(False) # DTR 핀을 LOW로 설정 (수신 모드)
try:
while True:
# 송신 모드로 변경
enable_tx()
time.sleep(0.01) # 전환 대기
# 데이터 송신
ser.write(b'PING\n')
print("송신: PING")
# 수신 모드로 변경
enable_rx()
time.sleep(0.01) # 전환 대기
# 응답 수신
response = ser.readline().decode().strip()
if response:
print("수신:", response)
time.sleep(1) # 반복 간격
except KeyboardInterrupt:
print("종료")
finally:
ser.close() # 포트 닫기
📌 RS-485에서는 송·수신 모드를 수동으로 변경해야 합니다.
📌 DE/RE 핀을 HIGH로 설정하면 송신 모드, LOW로 설정하면 수신 모드가 됩니다.
3. 송신(TX), 수신(RX) 전환 처리 (RS-485 특성)
RS-485는 반이중(Half-Duplex) 통신 방식이므로, 송·수신을 번갈아 수행해야 합니다.
Python 코드에서는 송신 전에 DE 핀을 HIGH로 설정하고, 송신이 끝난 후 다시 LOW로 변경하여 수신 모드로 전환해야 합니다.
✅ 송·수신 전환 코드 요약
- 송신 모드 활성화
enable_tx() # DE 핀 HIGH ser.write(b'PING\n') # 데이터 전송
- 수신 모드 활성화
enable_rx() # DE 핀 LOW response = ser.readline() # 데이터 읽기
📌 RS-485는 데이터를 주고받을 때 반드시 송·수신 모드를 전환해야 정상적으로 동작합니다.
📌 송신 모드로 변경 후 데이터를 전송하고, 다시 수신 모드로 변경하여 응답을 받아야 합니다.
📌 요약
✅ RS-232는 1:1 통신 방식으로, USB-to-Serial 변환기를 사용하여 Python과 연결 가능
✅ Python을 사용하여 RS-232 장치와 데이터를 송수신하는 코드를 쉽게 작성 가능
✅ RS-485는 멀티 드롭 네트워크를 지원하며, 송·수신 모드를 번갈아 수행해야 함
✅ MAX485 모듈을 활용하여 RS-485 데이터를 송수신할 수 있으며, Python에서 송·수신 전환 코드가 필요함
'프로그래밍 > 시스템' 카테고리의 다른 글
시리얼 통신 실전 응용 및 마무리 - 1. 산업 자동화 및 PLC와의 연결 (0) | 2025.02.10 |
---|---|
시리얼 통신 소프트웨어 실습 - 3. 아두이노 및 라즈베리파이와 시리얼 통신하기 (0) | 2025.02.10 |
시리얼 통신 소프트웨어 실습 - 1. Python을 활용한 시리얼 통신 (pyserial 라이브러리) (0) | 2025.02.10 |
시리얼 통신 하드웨어 및 연결 실습 - 3. 송신(TX)과 수신(RX) 핀 개념 및 배선 실습 (0) | 2025.02.10 |
시리얼 통신 하드웨어 및 연결 실습 - 2. RS-485 모듈(MAX485)과 마이크로컨트롤러 연결 (0) | 2025.02.10 |