STM32串口对应的引脚
| 串口外设 | TX 引脚 | RX 引脚 | RTS 引脚 | CTS 引脚 | 备注 |
|---|---|---|---|---|---|
| USART1 | PA9 | PA10 | PA12 | PA11 | 最常用,挂载 APB2 高速总线,支持硬件流控 |
| USART2 | PA2 | PA3 | PA1 | PA0 | 挂载 APB1 低速总线,支持硬件流控 |
| USART3 | PB10 | PB11 | PB14 | PB13 | 挂载 APB1 低速总线,支持硬件流控 |
| UART4 | PC10 | PC11 | - | - | 仅异步,大容量型号支持,无硬件流控 |
| UART5 | PC12 | PD2 | - | - | 仅异步,大容量型号支持,无硬件流控 |
工程设置

模式选择!
| 模式选项 | 中文名称 | 核心特点 | 典型应用场景 |
|---|---|---|---|
| Disable | 禁用 | 串口外设完全关闭,不工作 | 不需要使用串口,节省功耗和资源 |
| Asynchronous | 异步模式 | 标准全双工 UART,无同步时钟 | 最常用的串口模式,比如和电脑、传感器的串口通信 |
| Synchronous | 同步模式 | 带同步时钟输出/输入的全双工通信 | 需要时钟同步的外设(如部分 SPI 兼容设备、同步串口外设) |
| Single Wire (Half-Duplex) | 单线半双工模式 | 单根线实现收发,同一时间只能发或收 | 简化布线的近距离通信,如单线串口、半双工总线 |
| Multiprocessor Communication | 多处理器通信模式 | 带地址帧识别的多设备总线通信 | 一主多从的串口总线,比如多节点传感器网络 |
| IrDA | 红外通信模式 | 适配红外 SIR 协议的编解码 | 红外设备通信,如老式遥控器、红外传感器 |
| LIN | LIN 总线模式 | 适配汽车 LIN 协议的主/从模式 | 汽车电子中的低成本车身网络 |
| SmartCard | 智能卡模式 | 兼容 ISO7816 协议的卡通信 | 接触式 IC 卡、SIM 卡读写 |
RS232设置
| 模式选项 | 中文名称 | 核心特点 | 典型应用场景 |
|---|---|---|---|
| Disable | 禁用流控 | 不使用硬件流控,仅通过TX/RX两根线通信 | 普通串口调试、低速传感器通信,无数据溢出风险的场景 |
| CTS Only | 仅CTS输入 | 仅启用CTS(Clear To Send)输入信号,控制本方发送 | 本方接收能力强,仅需根据对方状态控制发送的场景 |
| RTS Only | 仅RTS输出 | 仅启用RTS(Request To Send)输出信号,通知对方发送 | 本方接收能力有限,需要通知对方暂停发送的场景 |
| CTS/RTS | 全双工流控 | 同时启用CTS输入和RTS输出,实现双向硬件握手 | 高速串口通信、RS232/RS485总线、大数据传输等防溢出场景 |
普通的串口通讯一般用异步模式就可以了
配置串口

| 参数名称 | 可选项 | 核心说明与应用场景 |
|---|---|---|
| Baud Rate | 自定义波特率,常见值:9600、19200、38400、57600 115200、230400、460800、921600 |
串口通信的比特传输速率,通信双方必须完全一致。115200 是调试中最常用的通用波特率,低速设备常用 9600,高速大数据传输可选更高值 |
| Word Length | 8 Bits (including Parity) 9 Bits (including Parity) |
单个字符的总位数(含校验位)。 - 8 Bits:无校验时,实际数据位为8位,最通用; - 9 Bits:带校验时,数据位为8位+1位校验,或多处理器模式下的地址帧 |
| Parity | None(无校验)、Even(偶校验)、Odd(奇校验) | 奇偶校验方式,用于检测传输错误。 - None:无校验,效率最高,最常用; - Even/Odd:添加1位校验位,适合对可靠性要求高的工业场景 |
| Stop Bits | 1、0.5、1.5、2 | 帧结束的停止位数量。 - 1:最通用,兼容性最好; - 2:用于低速高干扰环境,提升接收稳定性; - 0.5/1.5:特定协议(如LIN)使用,普通串口不常用 |
| Data Direction | Receive only(仅接收) Transmit only(仅发送) Receive and Transmit(收发双全工) |
串口收发方向控制。 - 收发双全工:同时启用TX和RX,双向通信; - 仅发送/仅接收:节省资源,单向通信场景使用 |
| Over Sampling | 16 Samples、8 Samples | 接收端的过采样倍数。 - 16 Samples:默认配置,抗干扰强,对时钟精度要求低; - 8 Samples:可支持更高波特率,适合高速场景,但对时钟稳定性要求更高 |
工程代码
串口初始化

关于串口的初始化的函数在main.c里面的HAL_UART_Init
1 | HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) |
结构体UART_HandleTypeDef huart1
| 字段 | 含义 | 常用可选项 |
|---|---|---|
| huart1.Instance | 指定要配置的 UART 外设实例 | USART1 / USART2 / USART3 UART4 / UART5 / USART6 等 |
| huart1.Init.BaudRate | 波特率(比特 / 秒) | 9600、19200、38400、57600 115200、230400、460800、921600 等 |
| huart1.Init.WordLength | 数据位长度(含校验位) | UART_WORDLENGTH_8B(8 位) UART_WORDLENGTH_9B(9 位) |
| huart1.Init.StopBits | 停止位数量 | UART_STOPBITS_1(1 位) UART_STOPBITS_0_5(0.5 位) UART_STOPBITS_1_5(1.5 位) UART_STOPBITS_2(2 位) |
| huart1.Init.Parity | 奇偶校验模式 | UART_PARITY_NONE(无校验) UART_PARITY_EVEN(偶校验) UART_PARITY_ODD(奇校验) |
| huart1.Init.Mode | 收发模式 | UART_MODE_TX_RX(收发双全工) UART_MODE_TX(仅发送) UART_MODE_RX(仅接收) |
| huart1.Init.HwFlowCtl | 硬件流控模式 | UART_HWCONTROL_NONE(禁用) UART_HWCONTROL_CTS(仅 CTS) UART_HWCONTROL_RTS(仅 RTS) UART_HWCONTROL_RTS_CTS(CTS+RTS 全流控) |
| huart1.Init.OverSampling | 过采样倍数 | UART_OVERSAMPLING_16(16 倍采样) UART_OVERSAMPLING_8(8 倍采样) |
串口发送函数
1 | HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);//串口发送数据,使用超时管理机制 |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| UART_HandleTypeDef *huart | 结构体 | 选择串口组 | 看上方 |
| uint8_t *pData | uint8_t | 需要发送的数据 | — |
| uint16_t Size | uint16_t | 发送的字节数 | — |
| uint32_t Timeout | uint16_t | 发送数据超过该时间退出发送 | — |
1 | HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);//串口中断模式发送 |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| UART_HandleTypeDef *huart | 结构体 | 选择串口组 | 看上方 |
| uint8_t *pData | uint8_t | 需要发送的数据 | — |
| uint16_t Size | uint16_t | 发送的字节数 | — |
1 | HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);//串口DMA模式发送 |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| UART_HandleTypeDef *huart | 结构体 | 选择串口组 | 看上方 |
| uint8_t *pData | uint8_t | 需要发送的数据 | — |
| uint16_t Size | uint16_t | 发送的字节数 | — |
串口接受函数
1 | HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);//串口接收数据,使用超时管理机制 |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| UART_HandleTypeDef *huart | 结构体 | 选择串口组 | 看上方 |
| uint8_t *pData | uint8_t | 接收到的数据存放地址 | — |
| uint16_t Size | uint16_t | 接受的字节数 | — |
| uint32_t Timeout | uint16_t | 接受数据超过该时间退出发送 | — |
1 | HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);//串口中断模式接收 |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| UART_HandleTypeDef *huart | 结构体 | 选择串口组 | 看上方 |
| uint8_t *pData | uint8_t | 接收到的数据存放地址 | — |
| uint16_t Size | uint16_t | 接受的字节数 | — |
1 | HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);//串口DMA模式接收 |
| 参数 | 数据类型 | 作用 | 选项 |
|---|---|---|---|
| UART_HandleTypeDef *huart | 结构体 | 选择串口组 | 看上方 |
| uint8_t *pData | uint8_t | 接收到的数据存放地址 | — |
| uint16_t Size | uint16_t | 接受的字节数 | — |
其他函数
1 | HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数 |