串口接收开始时正常,过一段时间接收不到任何数,其他程序正常,没有死机

在初始化后,如果曾经接收正常过,说明你的基础配置是没有问题的,过一段时间后收不到任何数,并且你的程序还在跑,并没有硬件错误之类的,这种情况一般是数据量太大导致了串口的过载宕机。

如何确定你的串口是否过载宕机了?连接你的单片机进入仿真,peripherals->system view->USART里选择你的当前可能宕机的串口号,则会出现该串口的寄存器,在新出现的页卡里找到ISR寄存器展开,往下翻找到ORE,看是否被打上了√,当发生串口过载错误时,就会出现此现象。

给一个简单直接的解决办法,大家可以用这个办法为基础,自己依据需求变化:

利用你程序里已经开的定时器,周期不用太长或者太短,1秒钟-1分钟都可以,只要你能接受,直接判断ORE是否被置位,判断ORE的方法如下:

标准库查询函数USART_GetITStatus(USARTx, USART_IT_ORE)

hal库查询函数__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE);

如果查询判断结果是1,直接重新初始化对应的串口。初始化串口的函数不用我罗列了,就是程序一开始调用的那个,usart1_init()什么的,hal库有自己生成的init,重新调用一下,那么串口就会重新启动了。

下面贴了hal库的解决方法,以串口2为例,标准库也类似,甚至标准库的初始化更简单直接将main开始的串口初始化函数再调用一遍即可。

//清理ORE的标志位
__HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
//可能需要在这插入
//如果你存储过初始化的数据,并且不想修改,直接重新初始化串口2
HAL_UART_Init(huart2);

//如果有你想修改,或者之前没有初始化的话,需要将下面的一段放到上面的插入处
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart2) != HAL_OK)
    {
        Error_Handler();
    }
    if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
    {
        Error_Handler();
    }
    if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
    {
        Error_Handler();
    }
    if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK)
    {
        Error_Handler();
    }

就是这么简单。

如果对你有用的话,留个言或者点个赞吧~

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值