跳到正文

Wiki

UART串口通信

約 4 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

1.Linux 串口通信

串口通信是機械人和嵌入式項目中最常見的底層通信方式之一。

在實際項目中,上位機經常需要通過串口和 STM32、ESP32、Arduino、傳感器模塊、調試板等設備進行數據交互。例如:

  • 上位機向 STM32 發送電機速度指令
  • STM32 向上位機返回編碼器數據
  • 讀取 IMU、GPS、激光測距模塊等傳感器數據
  • 使用 USB 轉串口模塊進行調試
  • 在 ROS 2 底盤控制中和下位機通信

串口通信的特點是簡單、通用、成本低,特別適合上位機和單片機之間的點對點通信。

1.1.串口通信是什麼

串口通信通常指 UART 通信。在 Linux 上,常見的 USB 轉串口設備會被識別為類似下面的設備文件:

/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyACM0

程序只需要打開對應的設備文件,並設置好波特率、數據位、停止位、校驗位等參數,就可以進行數據收發。

常見參數包括:

參數 説明
設備名 例如 /dev/ttyUSB0/dev/ttyACM0
波特率 例如 115200、921600
數據位 常見為 8 位
停止位 常見為 1 位
校驗位 常見為無校驗
流控 一般項目中常關閉硬件流控

在機械人項目中,串口通常不會只發送普通字符串,而是會設計自己的二進制通信協議,例如幀頭、長度、命令字、數據區、CRC 校驗等。

1.2.Linux 下常見串口庫

Linux 下使用串口通信有多種方案,常見的包括:

方案 類型 特點 適合場景
termios Linux 原生接口 最底層、依賴少、通用性強,但代碼相對繁瑣 想深入理解 Linux 串口機制
boost::asio 通用 C++ 庫 支持同步/異步,代碼結構較清晰,跨平台能力較好 推薦用於 C++ 工程封裝
libserial 第三方串口庫 使用簡單,比 termios 更易上手 普通串口收發項目
serial_driver ROS 2 生態封裝 更方便接入 ROS 2,但不適合只依賴 ROS 2 以外的項目 純 ROS 2 項目或參考實現
pyserial Python 串口庫 使用非常簡單,適合快速測試 Python 調試腳本

這些庫本質上都是為了完成串口的打開、配置、讀取和寫入,只是封裝層次不同。

1.3.各方案對比

方案 優點 缺點
termios Linux 原生、依賴最少、底層能力強 配置繁瑣,初學者容易寫錯
boost::asio C++ 工程友好,異步通信方便,適合封裝 driver 需要理解 asio 的基本模型
libserial 簡單易用,上手快 靈活性和工程可控性不如自己封裝
serial_driver 和 ROS 2 生態結合方便 離開 ROS 2 後複用性較差
pyserial 調試快,適合腳本 不適合作為高性能 C++ 底層驅動主線

1.4.本教程建議選擇

本教程建議優先選擇:

boost::asio

原因是:

  • 比直接使用 termios 更適合 C++ 工程開發
  • 可以封裝成普通 C++ driver,方便複用
  • 不依賴 ROS 2,OpenCV、Qt、普通 C++ 項目都能使用
  • 後續也可以很自然地接入 ros2_control hardware_interface
  • 比較適合機械人上位機和 STM32 通信場景

推薦的工程結構是:

上层项目:ROS 2 / OpenCV / Qt / 普通 C++ 程序

自己封装的 SerialDriver 类

boost::asio

/dev/ttyUSB0

STM32 / ESP32 / 传感器

1.5.與 ROS 2 的關係

學習 Linux 串口通信,並不代表不用 ROS 2。

在 ROS 2 項目中,可以將串口通信封裝成一個普通 C++ 類,然後在 ROS 2 節點或 ros2_control hardware_interface 中調用它。

例如:

ros2_control controller

hardware_interface

自己封装的 SerialDriver

boost::asio

STM32

這樣做的好處是,串口通信代碼不會和 ROS 2 強綁定。以後即使寫 OpenCV 項目、Qt 上位機或者普通 C++ 調試程序,也可以繼續複用同一套串口 driver。

1.6.本章學習目標

學習完本章後,應該能夠掌握:

  • Linux 下串口設備的基本概念
  • 如何查看和打開 /dev/ttyUSB0 等串口設備
  • 串口波特率、數據位、停止位、校驗位等基本參數
  • 使用 C++ 進行串口數據收發
  • 設計簡單的上位機與下位機通信協議
  • 將串口通信封裝成可複用的 C++ 類
  • 為後續接入 ROS 2、OpenCV、Qt 項目打基礎