• UART

    • 범용 비동기 송수신 장치(Universal Asynchronous Receiver/Transmitter)
    • 직렬 통신을 사용하며 아두이노 보드에 기본적으로 내장된다.
  • 관련 용어

    • UART 통신 라인
      • TX(Transmit): 데이터를 송신하는 핀
      • RX(Receive): 데이터를 수신하는 핀
      • GND(Ground): 공통 접지 (두 디바이스의 기준 전압을 동일하게 설정하기 위해 필요)
    • 프레임
      • Start Bit, Data Bit, (선택적) Parity Bit, Stop Bit의 순서로 이어 붙여 만든 결과물을 하나의 데이터 프레임으로 간주한다.
      • Data Bit는 5~9의 크기를 가지며 일반적으로 8(1 바이트)의 크기를 사용한다.
    • Baud Rate(보오율)
      • 데이터 전송 속도
      • bps 단위를 사용하며 보통 9600 bps, 115200 bps를 사용한다.
      • 송신측과 수신측의 baud rate는 서로 일치해야 한다.
    • USB to UART Converter
      • USB 포트를 가진 디바이스(Android, PC)와 UART 통신만 가능한 임베디드 기기 사이에서 데이터를 주고 받을 수 있도록 해주는 변환 장치
      • 주로 FTDI, Silicon Labs, Prolific 등의 칩을 사용한다.
      • 일부 아두이노 보드에 외장으로 장착되어 UART 신호를 usb로 전달하기도 한다.
  • 통신 프로세스

    • 송신기에서 데이터 프레임 송신
    • 수신기는 데이터 프레임 수신
    • 수신기는 프레임 구조를 기반으로 데이터 재구성
  • 버퍼 크기 결정

    • Baud Rate를 고려하여 결정한다.
    • 예를 들어 115200bps 기준으로 초당 14400(=115200/8) 바이트를 저장할 수 있다.
    • 따라서 1초당 버퍼에 저장 가능한 최대 크기는 14400 바이트가 된다.
    • 물론 오버플로우가 발생할 경우를 대비해 별도의 예외처리는 해줘야 한다.
  • 데이터 프레임 선택 기준 결정

    • 데이터를 지속적으로 수신하여 측정한 값을, 최소 30fps 이상 유지하면서 화면에 노출해야 하는 상황 가정
    • 1000ms / 30 = 33.3ms 이므로, 33.3ms 간격으로 UI 갱신를 갱신해야 한다.
    • 넉넉하게 30ms 주기를 설정한 후, 버퍼에 저장된 데이터 중 30ms 간격으로 수신된 프레임만을 추출하여 태블릿 UI에 노출하는 방식을 고려해볼 수 있다.
  • 바이트 처리 순서 결정

    • 하위 바이트 순으로 송신 -> 리틀 엔디안
    • 상위 바이트 순으로 송신 -> 빅 엔디안
  • Android 관련 실무 경험 기록

    • 실무에서 접한 USB to UART Converter는 Prolific PL2303 드라이버를 지원하는 컨버터 칩
      • 출력은 낮은 대신 가격은 저렴하다고 함
    • 재활 치료 기기가 실시간으로 송신하는 데이터는 운동 방향, 각도, 과열 여부 등의 정보를 담고 있었음
    • usb-serial-for-android 라이브러리를 사용하여 기초 통신 모듈 구현
    • 별도의 앱 개발 과정 없이 임베디드 기기로부터 수신한 데이터를 모니터링하고자 할때는 Serial USB Terminal 같은 앱을 사용할 수도 있다.
    • 컨버터를 사용하는 동안에는 usb를 사용한 디버깅이 불가하므로 원격으로 디버깅하도록 한다.