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()