前言
串口 USART 是嵌入式第一个、最重要、用得最多的通信外设,属于串行、异步、一对一、全双工通信。
不管是代码调试打印、蓝牙通信、GPS 采集、上位机通信、串口屏显示,全部依赖串口。
很多同学学串口只会复制 printf 模板,只会调用函数,不懂底层原理。
遇到乱码、丢包、收不到数据、接收卡死完全不会排查。
本篇文章纯零基础、学生向、练项目向,从零彻底吃透 USART,包含:硬件接线、基础通信概念、帧结构、波特率原理、奇偶校验讲解、三种收发模式、常见报错、全套排错思路。
看懂这一篇,串口再也不用死记代码。
一、基础通信概念梳理
- 串行通信
数据不一次性并行传输,按照先后顺序,一位一位逐根导线依次发送,串口仅依靠TX、RX两根信号线传输数据,属于典型串行通信。优点布线简单,远距离传输稳定;缺点传输速度弱于并行通信。
- 异步通信
通信双方没有共用时钟信号线,不靠时钟同步时序,提前约定统一波特率、帧格式,设备自行采样识别数据,USART日常使用模式就是异步通信。
- 一对一通信
一个发送端只对应一个接收端,点对点传输,串口基础用法为一对一,不适合一主多从大规模挂载。
- 全双工通信
TX、RX两条线路相互独立,同一时刻可以一边发数据、一边接收数据,收发互不干扰,串口天生支持全双工。
二、UART / USART 到底有什么区别?
1、UART(异步串口)
只有两根线:TX、RX
没有时钟线,双方靠约定波特率通信。
我们平时所有的调试串口、USB转串口、模块通信,全部都是 UART。
2、USART(同步/异步串口)
USART = UART异步通信 + 同步时钟通信
异步模式:就是我们日常用的串口,串行、异步、一对一、全双工
同步模式:多出一根 SCLK 时钟线,不需要波特率
重点:99% 的学习和项目只用到异步模式,等同于 UART。
三、串口硬件接线原理(90%新手踩坑点)
1、终极接线规则(死记)
TX 接 RX,RX 接 TX,GND 必须相连
单片机 TX → 外设 RX
单片机 RX → 外设 TX
单片机 GND ↔ 外设 GND
2、为什么必须交叉?
TX 是发送,RX 是接收
你发的数据必须对方收,对方发的数据必须你来收,全双工通信依靠交叉接线实现双向收发。
3、为什么必须共地?
两个设备电压基准不一样!
不共地 = 电平识别错乱 = 百分百乱码 / 不收数据
可以分开供电,但地线必须连在一起。
4、电平注意(防烧芯片)
STM32 是 3.3V TTL
很多模块是 5V TTL
5V TX 绝对不能直连 3.3V 单片机 RX
会击穿 IO,解决方法:串1k电阻或电平转换。
补充:初始化为何同时开启USART与GPIO时钟
GPIO引脚与USART是两个独立硬件:
1.GPIO时钟:TX、RX引脚要配置复用功能,引脚电平检测、电路驱动需要时钟,不开时钟引脚失效;
2.USART时钟:串口内部分频、移位、校验、中断硬件需要时钟,不开时钟串口休眠无法工作。
USART1挂载APB2总线,其余串口挂载APB1总线,开启时钟时需要对应总线。
四、串口帧结构(所有乱码的根源)
串口不是发字节,是发一帧一帧的数据
标准帧格式:起始位 + 数据位 + 校验位 + 停止位
1、各分段介绍
起始位:固定1位低电平,用来唤醒接收端,告知即将传输数据;
数据位:常用8位,承载要传输的有效数据;
校验位:可选,用来简单校验传输数据是否出错,分为无校验、奇校验、偶校验;
停止位:常用1位高电平,标记单帧数据传输结束。
2、三种校验方式详解
N 无校验
日常调试默认8N1,不额外计算校验位,传输速度最快,绝大多数普通场景使用。E 偶校验
统计8位数据里1的总个数,保证总数为偶数;传输结束后接收端重新统计,数量不符代表数据传输出错。O 奇校验
统计8位数据里1的总个数,保证总数为奇数;接收端核对数量,不一致判定数据异常。
通信硬性条件
两端设备配置必须一模一样
波特率、数据位、校验方式、停止位,任意一项不匹配,直接乱码。
传输过程
空闲状态:总线一直高电平
拉低电平:起始位,通知对方准备接收
依次发送8位数据
按需发送校验位
拉高电平:停止位,结束一帧
五、波特率到底是什么?为什么会乱码?
1、波特率定义
每秒传输多少个二进制位
常用:9600、115200
2、为什么 115200 容易乱码?
波特率由时钟分频计算而来
高速波特率对晶振精度要求极高
晶振微小误差会累积错位 → 乱码
新手、调试、项目稳定优先用 9600
六、USART 三种收发模式(从入门到进阶)
1、轮询模式(新手入门)
CPU 一直死等收发完成
优点:代码简单、好理解
缺点:阻塞程序、极易丢包
适用:仅简单打印调试
2、中断模式(学生项目主流)
有数据再来处理,没事CPU正常跑代码
常用中断:
RXNE:收到一个字节
IDLE:总线空闲,一整包数据发完
ORE:接收溢出报错
标准写法:
中断只搬数据,主循环解析数据
中断里不写延时、不写打印、不写判断。
3、DMA模式(进阶必备)
硬件自动搬运数据,全程不用CPU参与
不卡顿、不丢包、速度最快
适合大批量数据传输、屏幕、高速串口收发
七、串口核心寄存器通俗理解
TDR:发送寄存器,写数据进去就自动发
RDR:接收寄存器,外部数据存在这里
SR状态寄存器:标记各类收发状态与报错,重点三个常用标志位:
TXE:发送寄存器为空。CPU写入1字节数据到TDR后,硬件移出数据时TXE自动置1,代表可以填入下一个待发送字节;轮询发送最常用判断位。
TC:发送完成标志。当前一整帧数据全部移位输出、TX线路回到空闲电平后,TC置1,代表单次字节发送彻底结束。
RXNE:接收寄存器非空。硬件成功接收1帧数据并存入RDR,RXNE立刻置1,是接收中断的触发源头。
BRR:波特率寄存器,决定通信速度
CR1:配置寄存器,用来开启/关闭奇偶校验、数据位长度等功能
补充简单区分
TXE只管寄存器空不空,TC只管一帧有没有彻底发完;RXNE是收到数据最直观的信号,检测到该标志就要立刻读取RDR,防止数据覆盖溢出。
八、串口所有常见问题 + 完整排错教程
1、能发不能收
TX/RX接反
RX引脚没开复用
没开接收使能
没开中断
2、全部乱码
波特率不匹配
校验方式、停止位、数据位配置不一致
没共地
3.3V/5V电平混用
115200波特率误差大
3、单字节正常、多字节丢包
用了轮询模式
没有缓冲区
接收速度跟不上
4、一直报 ORE 溢出错误
数据接收太快,CPU读取不及时
解决:加缓冲区、空闲中断、DMA
5、串口助手显示问号、方框
上位机校验、波特率等参数和单片机参数不一致
九、标准学习架构(学生练项目通用)
开启 RCC 时钟(USART + GPIO)
配置 GPIO 复用模式
配置波特率、数据位、校验模式、停止位、收发使能
配置中断优先级
中断缓存接收数据
主循环处理数据逻辑
十、串口使用场景
代码调试打印(无校验8N1)
HC05蓝牙、GPS模块(大多无校验)
工业简单通信(会用到奇偶校验)
串口屏、上位机数据交互
十一、面试高频考点总结
串口异步通信依靠什么同步时序?
依靠双方提前约定一致的波特率、帧格式,无共用时钟线,依靠起始位校准采样。TXE 和 TC 的区别?
TXE代表发送数据寄存器空置,可以写入新字节;TC代表当前整段数据完全移位发送完毕。为什么RXNE不及时读取会产生ORE溢出错误?
新接收的数据会覆盖RDR寄存器内未读取的旧数据,硬件判定接收溢出。串口接线为什么TX与RX交叉、GND必须共地?
TX负责发送、RX负责接收,交叉才能互相收发;共地统一电平参考基准,避免乱码。中断接收为什么禁止在中断内部做数据解析、延时、打印?
中断运行优先级高,耗时操作会拉长中断占用时间,极易造成数据丢包、系统卡顿。115200高速波特率更容易乱码的原因?
对晶振精度敏感,长时间采样误差累积,导致数据采样错位。奇偶校验的作用?
简单校验单字节传输正误,仅能排查少量错误,无法修复数据,工业通信常用。轮询、中断、DMA三种模式优缺点与适用场景?
轮询简单但阻塞CPU;中断平衡性能,日常项目最常用;DMA解放内核,适合高速大批量传输。
结束语
本文完整详细讲解了 STM32 USART 的全部核心知识点,包含通信基础概念、硬件接线、通信原理、帧结构、奇偶校验、波特率、三种收发模式和全套报错排查,非常适合新手系统学习、项目开发和期末复习。
觉得内容对你有帮助的话,点赞 + 收藏,方便以后随时翻看复习!
后续会持续更新 STM32 定时器、ADC、DMA、外设实战教程,欢迎关注!