이제까지 배운 UART 통신 구조를 PC 측에서 직접 수신하고 파일로 저장하는 실전 단계를 알아보자.
이제 진짜 디버깅과 데이터 수집이 뭔지 알아보는 단계이다.
지금까지 MCU에서 UART로 데이터를 보내는 구조를 익혔다.
이번엔 Python에서 그 데이터를 직접 수신하고, 로그로 저장해보자.
이번 아티클을 통해 MCU가 보낸 시리얼 데이터를 Python으로 받아서 직접 확인하고 로그로 저장하는 과정까지 해낼 수 있게 될 것이다.
1. 필요한 준비물
- Python 3.x
pyserial
패키지pip install pyserial
2. 기본 코드 예제: 시리얼 읽기
import serial
# 시리얼 포트 설정
ser = serial.Serial(
port='COM3', # 또는 '/dev/ttyUSB0' (Linux)
baudrate=9600,
timeout=1
)
while True:
if ser.in_waiting:
line = ser.readline().decode('utf-8').strip()
print(f"Received: {line}")
설명:
ser.readline()
은 줄바꿈 문자(\n
) 기준으로 데이터를 읽음- MCU에서
Serial.println()
으로 보낸 문자열이 대상
3. 로그 파일에 저장하기
import time
log_file = open("sensor_log.txt", "a") # 로그 파일 추가 모드
while True:
if ser.in_waiting:
line = ser.readline().decode('utf-8').strip()
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
log = f"[{timestamp}] {line}"
print(log)
log_file.write(log + "\n")
log_file.flush()
결과 예시:
[2025-05-29 10:43:12] Temp: 25, Humid: 60
[2025-05-29 10:43:13] Temp: 25, Humid: 61
4. 바이너리 패킷 파싱 예시
만약 MCU가 정해진 바이트 포맷(예: 7바이트 패킷)으로 데이터를 보내는 경우는?
def parse_packet(packet):
if packet[0] == 0xAA and packet[1] == 0x55:
cmd = packet[2]
length = packet[3]
temp = packet[4]
humid = packet[5]
checksum = packet[6]
if checksum == (cmd ^ length ^ temp ^ humid):
print(f"Temp: {temp}, Humid: {humid}")
else:
print("Checksum error")
while True:
packet = ser.read(7)
if len(packet) == 7:
parse_packet(packet)
5. 후기
6. 참고자료
'TIL > Firmware' 카테고리의 다른 글
[펌웨어] 시리얼데이터와 MQTT (0) | 2025.06.01 |
---|---|
[펌웨어] 시리얼 명령 처리 흐름이란? (0) | 2025.06.01 |
[펌웨어] 구조체와 포인터는 왜 중요한가 (0) | 2025.05.27 |
[펌웨어] 펌웨어 구조 : Main Loop, 인터럽트 (0) | 2025.05.27 |