串列埠通訊(UART)
什麼是 UART
UART(Universal Asynchronous Receiver/Transmitter)是一種非同步序列通訊方式,通常使用兩條資料線在兩個裝置之間傳送資料,是飛控系統中最常見的通訊介面之一。
在無人機與飛控應用中,UART 常用於連接 GPS、遙測模組、接收機、伴飛電腦、測距儀,以及系統除錯主控台等裝置。
UART 的特性
UART 是點對點通訊,不像 I2C 或 CAN 那樣屬於共享匯流排;一組 UART 連線通常只對應兩個裝置,且不使用位址機制。
這種方式的優點是結構簡單、相容性高、應用廣泛,但也代表每一個周邊通常都需要占用一組獨立的序列埠資源。
UART 的基本訊號
最基本的 UART 連線需要三條線:
TX
傳送資料輸出。
RX
接收資料輸入。
GND
共地參考。
部分飛控或周邊還會在同一組接口上額外提供 5V、3.3V、CTS、RTS 或其他控制訊號,但 UART 能否正常通訊,最核心的仍是 TX、RX 與 GND。
TX / RX 的交叉接法
UART 最常見的接線錯誤,就是 TX 和 RX 接錯方向。
正確接法如下:
裝置 A 的 TX 接到裝置 B 的 RX。
裝置 A 的 RX 接到裝置 B 的 TX。
兩端 GND 必須相連。
也就是說,傳送端要接到對方的接收端。如果 TX 對 TX、RX 對 RX,通常就不會有任何資料通過。
共地的重要性
即使 TX 與 RX 接對了,如果兩個裝置沒有共地,UART 仍可能無法穩定工作。
這是因為 UART 訊號需要以共同的地參考電位為基準;缺少共地時,接收端可能無法正確判讀高低電位,進而造成資料錯誤、斷續或完全無法通訊。
波特率(Baudrate)
UART 通訊雙方必須使用相同的波特率(baud rate),否則接收端看到的內容通常會變成亂碼或無法辨識的資料。
常見的波特率包含:
9600:部分 GPS 或簡單感測器常見的預設值。
57600:除錯主控台或部分遙測配置常見。
115200:MAVLink、GPS、伴飛電腦連線中很常見。
921600:高頻資料傳輸或高速鏈路時可能使用,但對線材與流控要求更高。
波特率的注意事項
當波特率提高到 921600 或更高時,通訊穩定度會更依賴線材品質、連線長度與硬體流控支援。
ARK 的 UART 文件特別指出,高速 UART 若沒有 CTS/RTS 等硬體流控,在較長線材上容易丟包;只有在板對板短距離連線時,才較可能穩定運作。
資料格式
UART 在飛控與周邊應用中,最常見的資料格式是 8N1,也就是:
8 個資料位元。
無 parity。
1 個 stop bit。
這通常是大多數 GPS、遙測與飛控周邊的預設值,因此實務上很少需要特別修改。
飛控裡的 UART 用途
在一般飛控系統中,UART 常見用途包括:
GPS 模組資料輸入。
遙測模組與地面站通訊。
接收機序列輸入,例如某些 SBUS、CRSF 或其他數位接收協定。
伴飛電腦與飛控之間的資料交換,例如 MAVLink 或其他控制/感測通訊。
系統除錯主控台輸出,用來檢查開機訊息、錯誤日誌或互動式命令列。
邏輯序列埠與實體 UART
在一些主流飛控韌體中,使用者看到的 SERIAL0、SERIAL1、SERIAL2 這類名稱,往往是邏輯序列埠編號,不一定直接等於晶片上的 UART1、UART2、UART3。
SERIALx 與實體 UART/USART 的對應關係由硬體定義檔決定,因此同樣標示為 SERIAL3 的埠,在不同飛控上可能對應到不同的實體接口。
常見的序列埠角色
常見的序列埠角色包含 USB、遙測埠、GPS 埠與使用者自定義埠,不過實際對應仍依板卡硬體而定。
以 ArduPilot 為例,Serial 0 通常對應 USB,Serial 1 與 Serial 2 常用於遙測,Serial 3 與 Serial 4 常用於 GPS,而後面的序列埠則可能保留給其他用途或預設停用。
協定配置
在支援參數化序列埠管理的飛控韌體中,一個 UART 不只是一條線路,而是還需要指定它承載哪一種協定。
以 ArduPilot 為例,SERIALx_PROTOCOL 可設定為 GPS、MAVLink、RC Input、ESC Telemetry、DisplayPort、Rangefinder、OpticalFlow、DDS XRCE 等多種用途,代表同一個實體埠能透過參數被重新指定給不同周邊。
進階序列選項
部分飛控還提供 UART 的進階設定,例如 RX/TX 反相、半雙工、RX/TX 交換、上拉/下拉與 DMA 行為控制等功能。
ArduPilot 將這些功能整理在 SERIALx_OPTIONS 之中,並指出某些功能只在特定 MCU 等級或特定板卡上支援,因此設定前必須先確認硬體能力。
接收機與 UART
有些序列接收機協定可以直接接在一般 UART 上,但不是所有情況都能即插即用。
例如 ArduPilot 文件提到,任意支援的 UART 可能都能拿來做 RC 輸入,但像 SBUS、FPort 這類協定可能涉及反相需求;若 UART 本身不支援反相,就可能需要額外硬體反相器。
除錯主控台
UART 也是存取飛控底層除錯主控台的常見方式之一。
在這種模式下,UART 可用來查看開機訊息、啟動錯誤、感測器狀態與診斷資訊,因此當飛控無法正常啟動、USB 無法辨識或韌體異常時,除錯 UART 常是非常重要的排查入口。
線材與抗干擾
UART 本質上不是長距離、強抗干擾的匯流排,因此線材品質與布線方式很重要。
較高波特率下盡量縮短線長,並使用扭絞方式降低干擾;例如將 TX 與 GND、RX 與 GND 成對佈線,能比鬆散平行走線更穩定。
電壓相容性
大多數現代飛控 MCU 的 UART 邏輯電位是 3.3V,因此直接接到 5V UART 裝置可能造成不穩定,甚至損壞 MCU。
如果周邊裝置使用 5V 邏輯電位,應先確認其輸出是否為 3.3V 相容;必要時應加入電平轉換器,而不是直接硬接。
常見問題
以下是 UART 最常見的問題來源:
TX / RX 接反:最常見,也最先檢查。
波特率不一致:常見症狀是亂碼或完全沒資料。
缺少共地:兩端看似接好,但訊號無法正確判讀。
電壓不相容:3.3V 與 5V 邏輯混接可能導致失敗或損壞。
線材太長或佈線太差:特別在高波特率、馬達干擾或震動環境下更容易出問題。
序列埠已被其他功能占用:物理埠接對了,但韌體參數把它指定給了別的協定。
建議排查順序
如果 UART 通訊異常,建議依序檢查下列項目:
確認 TX 對 RX、RX 對 TX、GND 對 GND。
確認兩端波特率相同。
確認資料格式是否為預期值,通常為 8N1。
確認該實體接口在韌體中被指定為正確協定。
確認周邊的邏輯電位是否與飛控相容。
確認線長、焊點與接頭是否穩定。
必要時使用示波器或 USB-UART 工具直接觀察 TX/RX 訊號。
注意事項
注意: UART 不是多點共享匯流排,一組 TX/RX 通常只應連到一個對應裝置,除非你非常清楚該協定與硬體架構允許特殊接法。
注意: 不同飛控對「GPS」、「TELEM1」、「UART4」、「SERIAL3」這些名稱的對應可能不同,接線前應同時對照硬體接腳表與韌體參數配置。
注意: 高波特率並不一定比較好;若周邊資料量不大,使用較保守且穩定的波特率,通常比追求高速更可靠。
最后更新于