第 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 项目打基础