RMVL  2.2.0-dev
Robotic Manipulation and Vision Library
载入中...
搜索中...
未找到
串口通信模块

作者
赵曦
日期
2023/06/22

上一篇教程:聚合类反射及其相关 API
下一篇教程:工业自动化通信协议 OPC UA


相关类 rm::SerialPort

1. 简介

串口通信是一种通过串行数据传输进行通信的方式。它使用串行接口将数据以逐位的方式进行传输,常用于连接计算机与外部设备、嵌入式系统之间的数据传输。

串口通信一般涉及两个主要概念: 串口波特率

  • 串口:指的是通信中的物理接口,常见的有 RS-232RS-485UART 等标准。每个串口都有相应的引脚用于发送和接收数据以及控制信号。
  • 波特率:也称作数据传输速率,指的是每秒钟传输的位数。波特率决定了传输速度的快慢,通常使用常见的波特率如 9600、115200 等。

2. 使用

2.1 初始化

rm::SerialPort 的构造函数原型如下

SerialPort(std::string_view device, SerialPortMode mode = {});
参数 含义
device 设备名,在 Windows 上一般是 COMx,Linux 上一般为 ttyUSBxttyACMx
mode 串口通信模式,包含波特率 rm::BaudRate 和读取模式 rm::SerialReadMode

2.2 数据 I/O

rm::SerialPort 提供了极其方便的串口读取、写入的接口。

读取函数原型
template <typename AggregateT>
bool read(uint8_t head, uint8_t tail, AggregateT &data); // (1) 指定头尾帧的读取结构化数据
template <typename AggregateT>
bool read(AggregateT &data); // (2) 读取结构化数据
bool read(std::string &data); // (3) 读取字符串数据
template <typename AggregateOrStringT>
SerialPort &operator>>(AggregateOrStringT &data); // (4) 串口读取操作符重载
写入函数原型
template <typename AggregateT>
bool write(const AggregateT &data); // (5) 写入结构化数据
bool write(std::string_view data); // (6) 写入字符串数据
template <typename AggregateOrStringT>
SerialPort &operator<<(const AggregateOrStringT &data); // (7) 串口写入操作符重载
参数
data读取、写入的数据
head帧头
tail帧尾

注解

(3) 和 (5) 带有 Python 接口

2.3 链路层协议

写数据(视觉端 → 电控端)

SerialPort 的通信协议一般就是指数据链路层的协议,采用封装成帧的方式,由于终端设备输出缓冲区可在写入数据前被清空,因此 rm::SerialPortwrite 方法不设置任何帧头帧尾。

读数据(电控端 → 视觉端)

而输入缓冲区则会持续收到来自下位机的数据,因此 rm::SerialPortread 方法提供了两个 uint8_t 类型帧头帧尾的传入参数,下位机发送的数据需要在有效数据包前后设置两个 uint8_t 的校验位,帧头和帧尾具体的数据可自行设置。

需要注意的是,在读取数据前需要留意

  • 协议(结构体)内容
  • 内存对齐规则,关于内存对齐可使用 #pragma pack 宏或使用 C++ 标准的 alignas 关键字
  • 头尾帧是否一致