项目需求需要每50ms发送数据,接收端要接收不定长数据,采用 HAL_UART_Receive_IT 方式读取1字节进入中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *uartHandle)
{
HAL_UART_Receive_IT(&UartHandle, &g_recvBuf.recvByte, 1);
}
问题出现,发送多个数据后,开始能接收进入中断,过段时间进入中断就卡死了
怀疑是在串口接收完成回调中调用中断接收函数HAL_UART_Receive_IT()失败导致的接收停止,捕捉函数的返回值发现错误
改进:需要判断一次,清除错误
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *uartHandle)
{
HAL_StatusTypeDef ret_state = HAL_UART_Receive_IT(&UartHandle, &g_recvBuf.recvByte, 1);
if (ret_state == HAL_BUSY) {
__HAL_UART_CLEAR_OREFLAG(&UartHandle); // 由于ORE寄存器导致的出错
UartHandle.RxState = HAL_UART_STATE_READY;
UartHandle.Lock = HAL_UNLOCKED;
HAL_UART_Receive_IT(&UartHandle, &g_recvBuf.recvByte, 1);
}
}
查询文章得到原因
ORE:过载错误 (Overrun error)
当RXNE仍然是’1’的时候,当前被接收在移位寄存器中的数据,需要传送至RDR寄存器时,硬
件将该位置位。如果USART_CR1中的RXNEIE为’1’的话,则产生中断。由软件序列将其清零
(先读USART_SR,然后读USART_CR)。
0:没有过载错误;
1:检测到过载错误。
注意:该位被置位时, RDR寄存器中的值不会丢失,但是移位寄存器中的数据会被覆盖。如果
设置了EIE位,在多缓冲器通信模式下, ORE标志置位会产生中断的。