2020-08-23

STM32串口使用问题-使用一段时间无法接收

参考这个文章
https://blog.csdn.net/mickey35/article/details/78529637
串口接收时出现错误,进入错误回调程序,没有再启动HAL_UART_Receive_IT(huart,(u8 *)&i,1);接收一字节,串口再也无法进入接收中断,那怕在主程序中使用HAL_UART_Receive_IT(huart,(u8 )&i,1)。
先开启/
开启接收错误中断 */
__HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
添加错误处理回调
void HAL_UART_ErrorCallback(UART_HandleTypeDef huart)
{
/
Prevent unused argument(s) compilation warning */
UNUSED(huart);
uint8_t i = 0;
uint32_t isrflags = READ_REG(huart->Instance->SR);//手册上有讲,清错误都要先读SR
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)
{
READ_REG(huart->Instance->DR);//PE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_PE);//清标志
}
if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
{
READ_REG(huart->Instance->DR);//FE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_FE);
}

    if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
    {
            READ_REG(huart->Instance->DR);//NE清标志,第二步读DR
            __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_NE);
    }        
    
    if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)
    {
            READ_REG(huart->Instance->CR1);//ORE清标志,第二步读CR
            __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_ORE);
    }        


if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET) 
{
    __HAL_UART_CLEAR_OREFLAG(huart);
    HAL_UART_Receive_IT(huart,(u8 *)&i,1);
}

/* NOTE: This function should not be modified, when the callback is needed,
the HAL_UART_ErrorCallback could be implemented in the user file
*/
}

HAL存在错误回调函数,__weak表示编译器不关心这个函数,不会被编译。
__weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpd_led

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值