一、问题描述
38400波特率下,1位起始位,1位停止位,无校验位,使用中断方式接收从串口屏下发的通知信息(调用中断接收函数接收1字节,接收完成后在接收完成回调中再次调用中断接收函数接收1字节,实现不停接收信息),发现在长时间接收后串口接收会出现卡死现象,表现为不进串口接收完成回调。问题代码示例如下:

二、解决步骤记录
1、尝试对于单个串口统一使用中断方式接收和发送(之前是中断方式接收,轮询方式发送),问题有缓解,但是时间更长后还是会出无响应现象。
2、尝试使用HAL_UART_GetState()函数捕捉异常状态,失败,问题出现时函数返回HAL_STATE_READY。
3、尝试使用HAL_UART_ErrorCallback()回调捕捉异常状态,发现出现问题时并没有进入此回调。
4,怀疑是在串口接收完成回调中调用中断接收函数HAL_UART_Receive_IT()失败导致的接收停止,捕捉函数的返回值,返回HAL_BUSY,此时查询寄存器状态,发现SR寄存器中的ORE位被置1,手册对ORE位的解释为:
| ORE:过载错误 (Overrun error) 当RXNE仍然是’1’的时候,当前被接收在移位寄存器中的数据,需要传送至RDR寄存器时,硬 件将该位置位。如果USART_CR1中的RXNEIE为’1’的话,则产生中断。由软件序列将其清零 (先读USART_SR,然后读USART_CR)。 0:没有过载错误; 1:检测到过载错误。 注意:该位被置位时, RDR寄 |

本文针对串口中断接收方式下出现的卡死问题进行了详细分析,并通过清除ORE位解决了长时间运行后出现的无响应现象。

2万+

被折叠的 条评论
为什么被折叠?



