单片机通信协议--USART(串口通信)
文章目录
- 单片机通信协议--USART(串口通信)
- 通信协议
- 并行通信
- 串行通信
- USART(串口通信)
- 通信方式
- 发送接收原理图
- 数据格式
- 通信流程
- USART 同步/异步收发器
- USART简介
- USART框图
- USART模块有哪些引脚
- USART引脚在哪?如何配置?
单片机通信协议–USART(串口通信)
通信协议
作为讲解单片机通信协议的第一篇,先来简单介绍一下是通信协议
单片机(微控制器)中的通信协议是实现单片机与外设(传感器、显示屏、其他单片机等)或外部系统之间数据交换的规则集合,包括信号时序、数据格式、错误处理等。这些协议根据硬件接口、传输方式和应用场景的不同,可分为并行通信和串行通信两大类,其中串行通信因布线简单、成本低,在单片机中应用更广泛
并行通信
并行通信通过多根数据线同时传输多位数据(如 8 位、16 位),配合时钟线和控制线实现同步;并行通信的典型应用有单片机与并行 LCD1602 显示屏的连接(8 位数据总线 + RS、RW、E 控制信号)、单片机内部外设(如 RAM、Flash)与 CPU 的通信,在这里我们不做过多介绍
串行通信
串行通信通过单根或两根数据线逐位传输数据,布线简单(通常 2-4 根线),适合中短距离通信,是单片机外部通信的主流方式。根据是否需要时钟线同步,又分为异步通信和同步通信。串行通信协议中常用的协议有异步串行通信(UART/USART)、SPI(Serial Peripheral Interface,串行外设接口)、I2C(Inter-Integrated Circuit,集成电路总线)、单总线协议(1-Wire),下面对这四种协议进行对比:
| 对比维度 | USART(异步串行) | IIC(I2C) | SPI | 1-Wire(单总线) |
|---|---|---|---|---|
| 硬件接口线数 | 2 线(TX 发送、RX 接收,全双工) | 2 线(SCL 时钟、SDA 数据,半双工) | 4 线(SCLK 时钟、MOSI 主发、MISO 主收、CS 片选) | 1 线(DATA 数据,双向)+ 上拉电阻 |
| 同步方式 | 异步(无时钟线,靠波特率同步) | 同步(SCL 时钟线,主机控制) | 同步(SCLK 时钟线,主机控制) | 异步(主机通过时序控制同步) |
| 传输速率 | 中等(通常≤115200bps,最高几 Mbps) | 中低速(标准 100kbps,快速 400kbps,高速 3.4Mbps) | 高速(可达几十 Mbps,取决于硬件) | 低速(通常≤16kbps) |
| 拓扑结构 | 点对点(多设备需额外控制) | 多主多从(通过 7/10 位地址区分设备) | 一主多从(通过 CS 片选区分设备) | 一主多从(通过 64 位 ROM 地址区分设备) |
| 数据方向 | 全双工(同时收发) | 半双工(同一时间只能收或发) | 全双工(同时收发) | 半双工(同一时间只能收或发) |
| 错误检测机制 | 可选校验位(奇 / 偶 / 无),无应答机制 | 内置应答(ACK/NACK),部分设备支持 CRC | 无内置机制,需软件实现校验 | 简单 CRC 校验(部分设备支持) |
| 抗干扰能力 | 一般(单端信号) | 一般(单端信号,线少干扰相对较低) | 一般(单端信号) | 较弱(单线传输,易受干扰) |
| 典型应用场景 | 调试打印、蓝牙 / GPS 模块、上位机通信 | 温湿度传感器、EEPROM、RTC 实时时钟 | SPI Flash、OLED 屏、高速 ADC/DAC、无线模块 | 单总线温度传感器(DS18B20)、身份识别芯片 |
| 优势 | 硬件简单,点对点通信方便,无需时钟线 | 布线极简(2 线),多设备互联成本低 | 速率高,全双工,适合大数据传输 | 布线极致简单(1 线),适合低成本场景 |
| 劣势 | 速率有限,多设备通信复杂 | 速率中等,总线竞争需仲裁 | 线数较多,多从机时需多个 CS 引脚 | 速率极低,抗干扰差,通信效率低 |
对以上表格中的一些名词进行解释:
| 名词 | 解释 |
|---|---|
| 【全双工】 | 由两根数据线,一根用来接收,一根用来发送 |
| 【半双工】 | 一根数据线,既可以用来发送,也可以用来接收 |
| 【单工】 | 无法做到同时发送和接受数据 |
| 【同步通信】 | 有时间线,不需要约定采样频率 |
| 【异步通信】 | 需要约定合适的采样频率,用于在约定的频率内采集数据 |
USART(串口通信)
USART(Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步 / 异步收发器)是单片机中常用的串行通信协议,支持异步通信(最常用)和同步通信两种模式,其中异步模式(通常简称 UART)因硬件简单、使用灵活,在嵌入式领域应用最广泛
通信方式
- 异步模式(UART):无需时钟线,通过波特率(收发双方约定的传输速率)同步数据,仅需 2 根线(TX 发送、RX 接收)即可实现全双工通信
- 同步模式(USART):需额外时钟线(CLK),由主机提供时钟信号同步,适合更高精度的高速通信(较少用)
发送接收原理图

其中VCC和GND用于供电,TX和RX用于收发数据,设备1的TX要与设备2的RX相接,设备1的RX要与设备2的TX相接,它们的高低电平是相对于GND的。电平标准是数据0和数据1的表达方式,是传输线缆中认为规定的电压和数据的对应关系,串口常用的电平标准有以下的几种:
- 【TTL电平】 :+3.3v或 + 5v表示1,0V表示0
- 【RS232电平】 :-3~ 15v 表示1, +3~+15v表示0
- 【RS485电平】 :两线压差+2+6v表示1,-2-6v表示0(差分信号)
数据格式
每帧数据由以下部分组成(按传输顺序):
- 起始位:1 位低电平(逻辑 0),标志数据帧开始
- 数据位:5-9 位(通常 8 位,即 1 字节),表示有效数据(可配置高位在前或低位在前)
- 校验位(可选):1 位,用于简单错误检测,支持奇校验(数据位中 1 的个数为奇数)、偶校验(1 的个数为偶数)或无校验
- 停止位:1-2 位高电平(逻辑 1),标志数据帧结束,保证帧间隔
例:常见配置为 “8 位数据位 + 无校验 + 1 位停止位”,总帧长 10 位:

通信流程
在没有进入起始位之间电平的极性呈现出高电平,在进入起始位后电平转换为低电平表示开始发送数据,数据呈现出8个字节一位的特性,进入最后一位后低电平转化为高电平,方便下一次数据的发送,大概原理入下图所示

USART 同步/异步收发器
USART简介
USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
- 自带波特率发生器,最高达4.5Mbits/s
- 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
- 可选校验位(无校验/奇校验/偶校验)
- 支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN
- STM32F103C8T6 USART资源: USART1、 USART2、 USART3
USART框图

将框图简化后得到如下图示:

当我们发送数据的时候,数据会放在发送数据寄存器中,USART模块会通过TX引脚发送数据对应的波形,对侧设备的RX引脚接收到波形之后,通过解析可以拿到数据
当我们接收数据的时候,会从 RX引脚得到波形图,依据双方规定的数据帧格式进行解析得到数据,然后把数据放在接收数据寄存器中,我们就可以读到数据
通过配置波特率寄存器中的值来设置分频器的值,时钟频率除以分频器中的值再除以16就可以得到波特率。例如 当我们需要把波特率设置为115200时,STM 32的时钟频率为72MHz,我们就可以反向推出波特率寄存器中的值:

右上角的TE,TxC等都是USART中的状态寄存器,我们可以通过里面的值来判断收发状态:
| 编号 | 标志位名称 | 英文全称 | 功能说明 | 置 1 条件 |
|---|---|---|---|---|
| Bit 5 | RXNE | Read Data Register Not Empty | 接收数据寄存器非空(有数据可读) | 接收到 1 帧完整数据,存入接收缓冲区 |
| Bit 6 | TC | Transmission Complete | 发送完成(整帧数据发送结束) | 发送缓冲区空 + 移位寄存器(发送移位)也空(即最后 1 位已发送) |
| Bit 7 | TXE | Transmit Data Register Empty | 发送数据寄存器空(可写新数据) | 发送缓冲区的数据已转移到移位寄存器,缓冲区空闲 |
| Bit 3 | FE | Framing Error | 帧错误(接收时检测到无效停止位) | 接收数据时,停止位不是规定的高电平(如配置 1 个停止位,但实际未检测到高电平) |
| Bit 4 | ORE | Overrun Error | 溢出错误(接收缓冲区未读取,新数据覆盖旧数据) | 接收缓冲区已满(RXNE=1),但新数据已接收完成,旧数据被覆盖 |
| Bit 2 | NE | Noise Error | 噪声错误(接收数据时检测到干扰) | 接收数据过程中检测到不符合波特率的噪声信号(仅异步模式) |
| Bit 1 | PE | Parity Error | 奇偶校验错误(启用校验时,校验位不匹配) | 接收数据的校验位与计算出的校验位不一致(需提前配置校验模式) |
USART模块有哪些引脚

- USARTx_Tx:数据的发送引脚,将数据发送出去
- USARTx_Rx:数据的接收引脚,用来接收数据
- USARTx_CTS:全称 “Clear To Send”(清除发送),作用是接收方通知发送方 “是否允许继续发送数据”,避免因接收方缓冲区满导致数据溢出(比软件流控更高效、实时)
- USARTx_RTS:全称 “Request To Send”(请求发送),与USARTx_CTS 是配对使用的 “双向控制信号”;核心作用是 发送方主动通知接收方 “我要发数据了,请你准备接收”,配合 CTS 完成全双工通信的双向流量控制,避免数据溢出
- USARTx_CK:USARTx_CK 是 USART(通用同步异步收发传输器)同步模式(Synchronous UART,简称 Sync UART) 专用的时钟信号引脚,全称 “Clock”,核心作用是为同步通信提供统一的时钟基准—— 区别于我们常说的异步 UART(无需时钟,靠波特率同步),同步 UART 需通过 CK 信号实现发送方与接收方的严格时序对齐,提升通信速率和可靠性
USART引脚在哪?如何配置?
| 引脚类型 | 默认映射(无重映射) | 重映射(Partial Remap) | 配置要点(GPIO / 寄存器) |
|---|---|---|---|
| TX(发送) | PA9 | PB6 | 配置为「复用推挽输出」(GPIO_MODE_AF_PP);重映射需使能 AFIO_USART1_REMAP 位 |
| RX(接收) | PA10 | PB7 | 配置为「复用输入」(GPIO_MODE_AF_INPUT);重映射需使能 AFIO_USART1_REMAP 位 |
| CK(同步时钟) | PA8 | -(无重映射引脚) | 仅默认映射有效;配置为复用推挽输出(主)/ 复用输入(从);异步模式可悬空 |
| RTS(请求发送) | PA12 | PB14 | 需启用 USART_CR3 的 RTSE 位;配置为复用推挽输出;重映射需使能 AFIO_USART1_REMAP 位 |
| CTS(清除发送) | PA11 | PB13 | 需启用 USART_CR3 的 CTSE 位;配置为复用输入;重映射需使能 AFIO_USART1_REMAP 位 |
通过查看stm32f103c8t6的引脚分布图可以找到USART1的引脚映射,注意此时输出和输入都应该选择复用模式,因为CPU不是直接向引脚写数据,而是操作USART模块写;表格中的重映射作用为:当PA9这类默认映射引脚被占用时,使能 AFIO_USART1_REMAP 位,就可以通过PB6发送数据

