시리얼 통신 소프트웨어 실습 - 2. RS-232 / RS-485를 활용한 데이터 송수신 실습

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로 변경하여 수신 모드로 전환해야 합니다.

✅ 송·수신 전환 코드 요약

  1. 송신 모드 활성화
    enable_tx()  # DE 핀 HIGH
    ser.write(b'PING\n')  # 데이터 전송
    
  2. 수신 모드 활성화
    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에서 송·수신 전환 코드가 필요함