### 0.0.1 시리얼 기반 드라이버 구조 분석: Benewake TFmini/TF02 (tfmini.cpp 파서 및 상태 머신)
Benewake사의 TFmini나 TF02 라이다는 시리얼(UART) 포트를 통해 데이터를 쏟아낸다. UART 통신은 클럭선이 없는 비동기 통신이므로 쓰레기 데이터(Garbage)가 섞이거나 프레임 시작점을 놓칠 위험이 다분하다. 이를 처리하기 위해 src/drivers/distance_sensor/tfmini/tfmini.cpp 드라이버는 전형적인 FSM(유한 상태 머신, Finite State Machine) 파서(Parser) 아키텍처를 구현하고 있다.
TFmini의 시리얼 프로토콜 파싱 FSM 루직
TFmini는 한 프레임(Packet) 전송 시 9바이트를 고정적으로 반환하며, 첫 2바이트는 항상 고정된 프레임 헤더(0x59, 0x59)이다. 그 뒤로 거리 데이터(Distance, 2 bytes), 신호 강도(Strength, 2 bytes), 그리고 무결성 검증을 위한 체크섬(Checksum, 1 byte) 등이 뒤따른다.
PX4 드라이버의 collect() 스트림 읽기 함수 안에는 이 바이트들을 낚아채는 for 루프와 switch-case 구문이 맞물려 돌아간다.
- 상태
STATE0_WAIT_SYNC: 수신 버퍼에서 무의미한 데이터를 흘려보내다가 첫 번째0x59가 들어오면 상태를STATE1_SYNC_2로 올린다. - 상태
STATE1_SYNC_2: 바로 다음 바이트가 또0x59인지 검사한다. 만약 아니면 운이 나쁘게 데이터 중0x59와 겹친 쓰레기값이므로 가차 없이 다시 초기 상태(STATE0_WAIT_SYNC)로 강등(Reset)시킨다. - 상태
STATE2_GOT_SYNC: 헤더 2바이트가 완벽히 포착되었음을 확신하고, 이후 들어오는 바이트들을 드라이버 구조체(_linebuf)의 배열에 하나씩 차곡차곡 쌓으며 인덱스를 증가시킨다. - 체크섬 무결성 검사(Checksum Validation): 총 9바이트가 꽉 차면, 앞선 8바이트의 합산을
0xFF로 마스킹(Masking) 한 결과값이 배열의 마지막 통과 바이트(체크섬)와 완벽히 일치하는지 대조한다. 일치할 때만 C++ 구조체 안의 거리(distance\_m) 변수와 신뢰도(signal\_quality) 변수에 나누어(distance = (buf[3] \ll 8) | buf[2]) 저장한 후 드디어 uORB 토픽에 퍼블리싱한다.
이러한 바이트 바이트(Byte-by-Byte) 슬라이딩 윈도우 FSM 설계는 비행 중 발생하는 모든 시리얼 프레임 드롭이나 전송 노이즈로부터 시스템을 격리시키는 가장 완고하고 검증된 C++ 프로그래밍 패턴이다.