### 0.0.1 Auto-baud 탐색(Search) 스텝 트리(9600 $\rightarrow$ 115200) 및 포트 재설정(`tcsetattr`) 폴링(Polling) 로직

### 0.0.1 Auto-baud 탐색(Search) 스텝 트리(9600 \rightarrow 115200) 및 포트 재설정(tcsetattr) 폴링(Polling) 로직

PX4가 미지의 GPS 모듈과 처음 통신을 시도할 때, 커널 단에서 어떤 물리적 과정을 거쳐 직렬 포트(Serial Port)의 속도를 능동적으로 파악해 내는지 그 심연의 구동 방식을 분해해 본다. 이 자동 감지 프로세스는 비행 제어기(FC)의 하드웨어 레지스터와 운영체제(NuttX RTOS)의 제어 기능을 밑바닥까지 동원하는 폴링(Polling) 상태 머신의 결정체이다.

0.1 tcsetattr 인터페이스를 통한 동적 포트 파라미터 재설정

비행 제어기의 메인 칩셋(예: STM32F7/H7) 내부에 존재하는 UART 주변장치(Peripheral)는 통신 속도를 결정하는 분주비(Fractional Baud Rate Generator) 레지스터를 실시간으로 재설정할 수 있는 구조로 설계되어 있다.
PX4의 GPS 드라이버 스레드는 POSIX 표준 터미널 제어 API인 tcsetattr() 함수를 호출하여 런타임에 이 하드웨어 레지스터를 끊임없이 조작한다.

  • tcgetattr()를 통해 현재 드라이버에 마운트된 직렬 포트(예: /dev/ttyS3)의 속성 구조체(termios)를 백업 복사한다.
  • 구조체 내부의 입력(c_ispeed) 및 출력(c_ospeed) 보드레이트 필드에 타겟 속도 상수를 매핑한다. (예: B115200, B9600)
  • tcsetattr(fd, TCSANOW, &termios)를 호출하여 커널에 속성 변경을 지시한다.
  • TCSANOW 옵션은 버퍼에 들어있는 찌꺼기를 일절 기다리지 않고, 호출 즉시 하드웨어의 클럭 스플리터를 강제로 재배선(Re-wire)하도록 강제하는 극단적인 파라미터이다.

0.2 Auto-baud 스텝 트리(Step Tree) 구성과 진행 스케줄

PX4의 gps 드라이버에 구현된 루틴은, 가장 가능성이 높은 현대적 통신 속도부터 시작하여 구형 장비의 저속 통신망까지 계단(Step)식으로 훑어 내리는 하향식 스위핑(Downward Sweeping) 전략을 채택한다.

  1. Step 1. 초기 115200 bps 시도:
    최신 U-Blox GPS 모듈들이 공장 출하시 기본적으로 세팅되어 나오는 값이자, 무인기 통신의 사실상(De facto) 표준 속도이다. 약 0.5 ~ 1.2초가량 포트를 열어두고 읽기 버퍼(read())에 온전한 바이트 스트림이 맺히는지 수배한다.
  2. Step 2. 38400 bps 시도:
    대부분의 구형 픽스호크 1세대(Pixhawk 1) 시절 GPS나 일부 저가형 RTK 베이스 모듈에서 채용했던 속도이다. 앞선 스텝에서 실패했다면, tcsetattr로 포트를 재설정하고 다시 모기장 대기(Polling)에 돌입한다.
  3. Step 3. 57600 bps 시도:
    Mavlink 텔레메트리 기본 속도이면서, 간혹 특수 목적용 통신 모듈로 매핑된 GPS가 가지는 보드레이트다.
  4. Step 4. 구형 호환 최후의 보루 9600 bps:
    아주 오래된 NMEA 전용 구형 센서이거나, 칩셋이 설정 데이터를 잃고 메모리 초기화 디폴트(Factory Default) 상태로 추락했을 때 부팅되는 최하위 통신 속도이다. 이 구간마저 패스(Pass)해버렸다면 PX4 스레드는 잠시 숨을 고르거나 포트를 리셋한 후 다시 115200 bps부터 무한 루프 스윕을 전개한다.

0.3 노이즈와 가비지(Garbage) 속의 시그널 캐치 로직

Auto-baud 루틴 중 FC의 수신 버퍼에는 보드레이트 불일치로 인한 쓰레기 값들(Garbage Bytes)이 산더미처럼 쌓이게 된다. 예를 들어 9600bps로 전송된 신호를 115200bps로 수신하려 들면, 하드웨어 UART 수신기는 신호의 엣지(Edge)를 잘못 자르게 되어 의미 없는 특수문자와 널(Null, \0) 문자만을 토해낸다.

  • PX4는 단순히 “버퍼에 문자가 들어오는가?“로 성공을 판단하지 않는다. 들어오는 비트가 가비지인지 아닌지 실시간으로 판단할 파서(Parser)의 체(Sieve)가 필요하다.
  • 상태 머신이 현재 스텝(예: 115200)에 정박해 있는 동안, 백그라운드에서는 임시로 NMEA 파서와 UBX 파서를 동시에 메모리에 띄워 수신 바이트를 들이붓는다.
  • 가비지 문자는 파싱 트리에서 즉각 거부당하지만, 우연히 보드레이트가 딱 맞아떨어져 NMEA의 식별자인 달러 문자($) 이후 알맞은 텍스트가 전개되거나, UBX의 0xB5 0x62 동기화 매직 넘버(Magic Number)가 온전히 잡히면 그 즉시 플래그(Flag)를 띄워 “Baudrate Locked” 상태를 내부 메모리에 선언하고 스텝 트리 진행을 영구적으로 중단한다.

이 견고한 상태 머신 폴링 기법 덕분에 통신 포트는 사람의 손길(개입) 없이도 GPS 모듈과의 주파수 동기화를 독자적으로 성취해 내게 된다.