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