1-8 简易串口通讯协议(UART + 自定义帧协议)

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。 |

相关推荐
续写烂尾27 分钟前
SDNAND 硬件电路设计:供电、上拉与走线全景
单片机·嵌入式硬件·sd nand·sdnand
Brilliantwxx2 小时前
【STM32】 RTC 实时时钟详解:从概念到预分频器
stm32·单片机·嵌入式硬件·mcu·bash
lhbweilai5 小时前
分析FreeRTOS内核对象API的源码实现(四)
c语言·stm32·单片机
inrichtt8 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
半杯咖啡半行码9 小时前
Linux字符设备驱动开发基础:从设备号到ioctl的完整实战
stm32·单片机·嵌入式硬件
碧海银沙音频科技研究院10 小时前
基于炬芯ATS3089X的usb U盘/usb audio声卡/usb cdc虚拟串口/录音dump到本地功能实现
stm32·单片机·嵌入式硬件
优选资源分享10 小时前
PicGo v3.0.3 新版 | 开源免费图床工具
javascript·笔记·electron
@松10 小时前
学习stm32cudemx +vs 创建hex文件,刷机
stm32
CC1802539448610 小时前
具有强大的图像和语音处理能力的高性能 MCU芯片ESP32-P4NRW32X
单片机·嵌入式硬件
星恒随风11 小时前
Linux线程概念详解:从分页存储、页表、MMU与TLB,深入理解线程和进程的区别与联系
linux·运维·笔记·学习·状态模式