8.1 学习目标
理解串口(UART)异步通信的基本原理及关键参数(波特率、数据位、停止位、校验位)
掌握 STM32CubeMX 配置 USART 中断接收及使用 HAL 库函数
学习设计一个简易的串口通信协议(帧头、命令码、长度、数据域、校验和、帧尾)
实现数据帧的封装、发送、接收解析及校验,并处理常见命令(心跳、数据上报、状态查询等)
通过串口助手验证协议的正确性
8.2 项目原理与概述
在嵌入式系统中,串口(UART)是最常用的调试与通信接口之一。然而,仅靠原始字节流无法区分"一条完整命令"的边界,也难以保证数据可靠性。因此需要定义应用层协议,通过固定的帧格式对数据进行打包和校验,使下位机(STM32)能够正确识别命令并作出响应。
本章将设计一个简易的串口通讯协议,具备以下特点:
固定帧头 0xAA 和帧尾 0x55,用于帧同步
命令码(1字节)区分不同功能
数据长度(1字节)支持最长 64 字节载荷
异或校验和,保证数据完整性
支持心跳包、传感器数据上传、制冷片控制状态查询等常用命令
STM32 通过 USART1 与上位机(如串口助手或 PC 端软件)通信,接收并解析命令,执行相应动作后返回响应帧。
8.3 通讯基本知识点总结
8.3.1 通信方式分类
|--------|---------------|--------|
| 类型 | 方向 | 示例 |
| 单工 | 单向(固定发送端和接收端) | 广播电台 |
| 半双工 | 双向交错,不能同时 | 对讲机 |
| 全双工 | 双向同时 | 电话 |
8.3.2 同步通信 vs 异步通信
同步通信:共用时钟线,数据以字节块连续传输,效率高,如 SPI、I²C。
异步通信:无时钟线,以帧为单位传输,每帧包含起始位、数据位、校验位(可选)、停止位,靠波特率同步,如 UART。
8.3.3 串口(UART)通信参数
|--------|--------------|--------------|
| 参数 | 说明 | 常见取值 |
| 波特率 | 每秒传输的位数(bps) | 9600, 115200 |
| 数据位 | 每个数据帧的有效位数 | 8(最常用) |
| 停止位 | 标志帧结束的位数 | 1 或 2 |
| 校验位 | 简单检错 | 无、奇校验、偶校验 |
物理层标准:
TTL UART:逻辑 0=0V,逻辑 1=3.3V/5V,短距离(<1m)
RS-232:逻辑 0=+3~+15V,逻辑 1=-3~-15V,距离约15m
RS-485:差分信号,抗干扰强,可长达千米,多点通信
本章使用 STM32F103 的 USART1,引脚为 PA9(TX)和 PA10(RX),TTL 电平,通过 USB 转 TTL 模块连接电脑。
8.4 CubeMX工程配置
8.4.1打开工程
找到上一章生成的 .ioc 文件,双击该文件即可用 STM32CubeMX 打开。
8.4.2 配置 USART1
进入 Connectivity → USART1
Mode:Asynchronous(异步)
参数设置:
|----------------|----------------------|
| 参数 | 值 |
| Baud Rate | 115200 |
| Word Length | 8 bits |
| Parity | None |
| Stop Bits | 1 |
| Data Direction | Receive and Transmit |
开启 USART1 全局中断(NVIC 中勾选 USART1 global interrupt)。


8.4.3配置 GPIO
PA9(TX)和 PA10(RX)自动设置。
8.4.4生成代码
选择 MDK-ARM,分离 .c/.h。
8.5 代码解析与实现
8.5.1 定义一个全局变量用于测试。

8.5.2开启中断接收

8.5.3 重写回调函数
实现接收数据的直接回传。

8.5.4接线
将USB转TTL模块连接到单片机的PA10和PA9引脚,注意需要交叉连接TXD和RXD信号线,同时务必连接共地线(使用前保证驱动安装成功,驱动位置在《STM32实战派:完整仪器嵌入式开发教程》配套资料\01_开发工具\3. 串口调试助手\CH341SER)。

8.5.5找到端口
打开电脑的设备管理器,找到对应的端口

8.5.6打开并设置串口助手
使用串口助手时,请将串口号设置为与设备管理器一致,波特率调整为115200,并将收发数据格式设为HEX模式,最后点击打开按钮。

8.5.7发送数据
点击发送后。单片机立即将接收到的数据发送回来。

8.5.8代码说明
1.协议采用固定帧格式:帧头(0xAA)+命令码+数据长度+数据域+校验和+帧尾(0x55),确保数据传输的可靠性
2.支持最大64字节数据载荷,满足STM32F103的资源限制,同时保持协议的简洁性
3.提供完整的封包/解包和校验功能,包含参数检查和错误处理机制
4.使用异或校验算法检测数据完整性,算法简单高效适合嵌入式环境
5.包含心跳包、数据传输、状态查询等常用命令定义,满足基本通讯需求
8.5.9串口简易协议定义结构体等


8.5.10计算数据帧校验和

8.5.11封装数据帧

8.5.12解析原始数据为帧结构

8.5.13验证数据帧完整性

8.5.14命令处理函数

8.5.15在回调函数中接收数据

8.5.16 输出请求指令
在进入主循环前,将各请求指令输出至串口调试助手,并开启接收中断。


8.6 实验现象与调试
8.6.1 整理指令
将上电打印的请求指令,写右面指令框里

8.6.2 下发指令
四条指令循环发送时,下位机能够正常返回对应的响应数据。

8.6.3 常见问题与排查
|--------|-----------|---------------------------------|
| 现象 | 可能原因 | 解决方法 |
| 无法通讯 | TX与RX线接错了 | 两个设备间的TX与RX需要交叉接,设备A的TX接设备B的RX。 |