STM32串口接收分为阻塞式接收和中断式接收。
1、中断+DMA接收
出现突然不再接收数据的异常情况,最有可能的情况为ORE错误和BUSY标志位持续置高。
解决方法:在重新打开中断接收前,使用__HAL_UART_CLEAR_OREFLAG(huart);函数清除ORE错误;如果串口中断重新接收打开频繁且间隔短的话,有可能会出现BUSY标志位持续置高的情况,此时在重新打开中断接收前,需要先判断串口状态是否为HAL_BUSY,再判断是否能重新打开。
2、阻塞式接收
阻塞式接收为定长字节字节数,阻塞式接收突然不再接收数据的异常情况,大多数都是因为实际接收的字节超过了设定接收的字节长度,此时会导致ORE错误,且ORE错误一旦出现,后续的串口数据就不会再写入到缓存中。
解决方法:HAL_UART_Receive();函数没有清除ORE错误的功能,只要在调用这个函数前使用__HAL_UART_CLEAR_OREFLAG(huart);函数清除ORE错误。同时还要取出当前串口缓存中的数据,否则会有一个字节的数据停留在串口接收缓冲区中,导致这个字节数据成为下一帧的帧头,且下一帧字节数又会不正常,再次触发ORE错误。
代码如下:文章来源:https://www.toymoban.com/news/detail-540051.html
//判断是否触发了ORE错误
if(__HAL_UART_GET_FLAG(&huart, UART_CLEAR_OREF) != RESET)
{
//取出串口缓存中多余的字节数
uint8_t data = (uint8_t)(huart.Instance->RDR);
//清除ORE错误
__HAL_UART_CLEAR_FLAG(&huart, UART_CLEAR_OREF);
}文章来源地址https://www.toymoban.com/news/detail-540051.html
到了这里,关于STM32 HAL库串口突然不再接收数据的异常情况的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!