在初始化后,如果曾经接收正常过,说明你的基础配置是没有问题的,过一段时间后收不到任何数,并且你的程序还在跑,并没有硬件错误之类的,这种情况一般是数据量太大导致了串口的过载宕机。
如何确定你的串口是否过载宕机了?连接你的单片机进入仿真,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();
}
就是这么简单。
如果对你有用的话,留个言或者点个赞吧~