第 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 下使用串口通信有多種方案,常見的包括:
| 方案 | 類型 | 特點 | 適合場景 |
|---|---|---|---|
| termios | Linux 原生接口 | 最底層、依賴少、通用性強,但代碼相對繁瑣 | 想深入理解 Linux 串口機制 |
| boost::asio | 通用 C++ 庫 | 支持同步/異步,代碼結構較清晰,跨平臺能力較好 | 推薦用於 C++ 工程封裝 |
| libserial | 第三方串口庫 | 使用簡單,比 termios 更易上手 | 普通串口收發項目 |
| serial_driver | ROS 2 生態封裝 | 更方便接入 ROS 2,但不適合只依賴 ROS 2 以外的項目 | 純 ROS 2 項目或參考實現 |
| pyserial | Python 串口庫 | 使用非常簡單,適合快速測試 | Python 調試腳本 |
這些庫本質上都是爲了完成串口的打開、配置、讀取和寫入,只是封裝層次不同。
各方案對比
| 方案 | 優點 | 缺點 |
|---|---|---|
| termios | Linux 原生、依賴最少、底層能力強 | 配置繁瑣,初學者容易寫錯 |
| boost::asio | C++ 工程友好,異步通信方便,適合封裝 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 項目打基礎