-
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를 사용한 디버깅이 불가하므로 원격으로 디버깅하도록 한다.