You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F103 USART串口接收首字节重复或残留上一包末尾数据问题

问题根因排查

核心触发原因

  • 第一个核心现象完全匹配USART接收数据寄存器(RDR)存在残留未读数据的特征:每次启动接收时,RDR里已经存了1字节历史数据,调用HAL_UART_Receive()读取N字节时,会先读走这个残留字节,再读取N-1个新返回的字节,最终新返回的最后1字节就留在RDR里成为下一次接收的残留值,完美匹配你测试的5字节、6字节缓冲的异常结果。
  • 首次接收的残留字节是你发送的首字节0xAA,说明你发送数据时该字节被误存入了接收寄存器,常见触发场景:
    1. 硬件层面:USART的TX、RX引脚存在物理短接/串扰,或RS485电路方向控制引脚时序错误,发送时自身数据被回收到接收链路
    2. 软件层面:你当前贴出的初始化代码初始化的是USART1,但收发调用的串口实例是huart3,如果不是笔误,会导致串口配置异常,甚至出现收发通道串扰

解决方案

1. 硬件排查

  • 检查USART对应TX、RX引脚焊接/接线是否存在短接,相邻引脚有没有串扰
  • 如果你使用RS485进行通信,确认方向控制引脚的切换时序:发送完成后再切换为接收模式,避免发送的数据被自身回收

2. 软件修复

第一步:修正串口实例匹配问题

确认你实际使用的串口号,保证初始化逻辑和收发调用的huart实例完全对应,避免配置不生效问题。

第二步:每次接收前清空残留数据

在每次调用HAL_UART_Receive()之前,先清空接收寄存器的残留数据和错误标志,代码如下:

// 放在HAL_UART_Receive之前执行
__HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_ORE | UART_FLAG_NE | UART_FLAG_FE | UART_FLAG_PE);
uint8_t dummy;
// 循环读空RDR寄存器的所有残留数据
while(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE) == SET)
{
    dummy = (uint8_t)(huart3.Instance->DR & 0xFF);
}

修改后的主函数收发逻辑示例:

uint8_t b[5] = {0xAA,0xBB,0xCC,0xDD,0xEE};
HAL_UART_Transmit(&huart3,b, sizeof(b), 100);
uint8_t r[5]={0,0,0,0,0};
// 新增清空逻辑
__HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_ORE | UART_FLAG_NE | UART_FLAG_FE | UART_FLAG_PE);
uint8_t dummy;
while(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE) == SET)
{
    dummy = (uint8_t)(huart3.Instance->DR & 0xFF);
}
HAL_UART_Receive(&huart3, r, sizeof(r), 100); 
HAL_Delay(100);

uint8_t d[5] = {0x11,0x22,0x33,0x44,0x55};
HAL_UART_Transmit(&huart3,d, sizeof(d), 100);
uint8_t r2[5]={0,0,0,0,0};
// 每次接收前都执行清空
__HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_ORE | UART_FLAG_NE | UART_FLAG_FE | UART_FLAG_PE);
while(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE) == SET)
{
    dummy = (uint8_t)(huart3.Instance->DR & 0xFF);
}
HAL_UART_Receive(&huart3, r2, sizeof(r2), 100);
HAL_Delay(100);

验证逻辑

加了清空逻辑后,首次接收时会先把之前残留的0xAA读走丢弃,再等待接收外设返回的5个完整字节,后续每次接收前都会把上一包残留的末尾字节清空,不会带入下一次接收流程,即可解决首字节异常问题。

内容的提问来源于stack exchange,提问作者Jwdsoft

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:06:06