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

相关推荐
老猿讲编程1 小时前
【Eclipse OpenSOVD学习之二】 SOVD 协议原理与标准背景
学习·eclipse·嵌入式软件·车载·sovd
星栖与芯1 小时前
STM32MP157 M4 指针避坑(三):生命周期与内存踩踏——HardFault 重灾区
java·网络·stm32
蓝天下的守望者1 小时前
ARM SOC architecture学习文档整理
arm开发·学习
志尊宝1 小时前
Vue3 零基础每日笔记(004):模板语法初识——插值表达式、v-bind、v-on 一次学会
javascript·vue.js·笔记
三佛科技-187366133972 小时前
小家电/玩具MCU选型指南,国产低成本MCU替代之选
单片机·嵌入式硬件
花 满 楼2 小时前
TPWM — PWM 测量模式(TIM PWM Measurement Mode)
单片机·嵌入式硬件·fpga开发
SatanII2 小时前
OpenStack核心组件详解|Keystone+Glance+Nova+Cinder原理与实操笔记
网络·笔记·openstack
叶子野格2 小时前
《Verilog学习:前置知识》
学习·fpga开发
wuyk5552 小时前
从零吃透 MQTT 通信|第 6 章 MQTT 主题、过滤器、通配符、订阅管理、拒收机制详解与代码实现
c语言·stm32·学习