第 13.1 節

UART串口通信

0瀏覽次數0訪問次數--跳出率--平均停留

Linux 串口通信

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

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

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

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

串口通信是什麼

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

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

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

常見參數包括:

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

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

Linux 下常見串口庫

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

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

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

各方案對比

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

本教程建議選擇

本教程建議優先選擇:

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 / 传感器

與 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。

本章學習目標

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

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