STM32F1使用HAL_UART_Receive_IT接收时从上次断点写缓冲区如何解决
问题根因
该错位问题由STM32 HAL库UART中断接收的内部状态机制导致:
调用HAL_UART_Receive_IT后,HAL库会在对应的UART句柄(你这里是huart3)内部维护3个关键状态变量:
pRxBuffPtr:当前接收写入的指针偏移RxXferCount:剩余待接收的字节数RxXferSize:本次配置的总接收长度
你第一次调用接收接口后,收到20字节时pRxBuffPtr已经偏移到RxBuffer+20的位置,RxXferCount剩余5。你手动清空缓冲区仅修改了数组存储的内容,没有重置句柄内的状态变量,下一次数据进来自然会继续从偏移20的位置写入,直到收满25字节才会触发接收完成回调,最终出现数据错位。
修复方案
推荐采用官方标准流程重置接收状态,无需手动修改HAL库内部成员,兼容性最高:
- 初始化阶段第一次调用
HAL_UART_Receive_IT(&huart3, RxBuffer, sizeof(RxBuffer))开启接收 - 在接收完成(或你判定单帧接收结束)的逻辑中,按如下顺序执行操作即可让下一次接收从缓冲区0位开始写入:
// 先中止当前正在进行的接收,清空UART句柄内的状态参数 HAL_UART_AbortReceive_IT(&huart3); // 清空接收缓冲区 memset(RxBuffer, '\0', sizeof(RxBuffer)); // 重新调用接收接口,HAL库会自动将写入指针重置为缓冲区首地址 HAL_UART_Receive_IT(&huart3, RxBuffer, sizeof(RxBuffer));
补充建议
如果你是做不定长单帧接收,建议额外开启UART空闲中断,检测到总线空闲时判定一帧结束,再执行上述重置流程,可避免收不满配置的25字节就一直不触发接收完成回调的问题。
内容的提问来源于stack exchange,提问作者daaarwiin
相关产品推荐
相关产品推荐

