import serial import time import os # Mpi-5A의 UART 포트 설정 # RS232(UART0)는 /dev/ttyAMA0 에 매핑됩니다. # RS232(UART0)는 GPIO 14/15에 연결되어 있습니다. """ UART 통신을 초기화, 수신된 데이터를 송신 (에코 프로그램) """ SERIAL_PORT = '/dev/ttyAMA0' BAUD_RATE = 9600 def uart_echo_program(): print(f"UART Echo 프로그램 시작. 포트: {SERIAL_PORT}, 보드레이트: {BAUD_RATE}") try: ser = serial.Serial( port=SERIAL_PORT, baudrate=BAUD_RATE, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 # 1초 동안 데이터 수신 대기 ) ser.flushInput() # 입력 버퍼 비우기 except serial.SerialException as e: print(f"시리얼 포트 에러 발생: {e}") print("시리얼 포트가 이미 사용 중이거나 장치 이름이 올바르지 않은지 확인해 주세요.") return try: while True: # 데이터 수신 대기 if ser.in_waiting > 0: # 수신된 데이터 읽기 (바이트 단위) received_data = ser.read(ser.in_waiting) try: data_str = received_data.hex() # 수신된 데이터를 16진수 문자열로 변환 print(f"-> 수신: {data_str} ") # 수신된 데이터를 그대로 에코 (다시 전송) ser.write(received_data) print(f"<-에코: {data_str}") except UnicodeDecodeError: print(f"-> 수신 (인코딩 실패): {received_data.hex()}") ser.write(received_data) # 인코딩 실패해도 바이트 그대로 에코 print("<- 에코 (바이트)") time.sleep(0.01) # CPU 부하를 줄이기 위한 짧은 대기 except KeyboardInterrupt: print("\n프로그램 종료 요청.") finally: if 'ser' in locals() and ser.is_open: ser.close() print("시리얼 포트 닫힘.") if __name__ == "__main__": uart_echo_program()