STM32 Uart HAL发送数据太多导致接收不进入中断

项目需求需要每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标志置位会产生中断的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值