La recepción del puerto serie es normal al principio, pero después de un período de tiempo no se pueden recibir datos, otros programas son normales y no hay fallas.

Después de la inicialización, si la recepción ha sido normal, significa que no hay ningún problema con su configuración básica. Después de un período de tiempo, no recibirá ningún dato y su programa aún se está ejecutando y no hay ningún error de hardware o el Por lo general, esta situación se debe a que la cantidad de datos es demasiado grande, lo que provoca que el puerto serie se sobrecargue y el tiempo de inactividad.

¿Cómo determinar si su puerto serie está sobrecargado y caído? Conecte su microcomputadora de un solo chip para ingresar a la simulación, seleccione su número de puerto serie que puede estar inactivo actualmente en periféricos->vista del sistema->USART, y aparecerá el registro del puerto serie, busque el registro ISR en la nueva página y desplácese hacia abajo Buscar ORE y vea si está marcado con √. Este fenómeno ocurrirá cuando ocurra un error de sobrecarga del puerto serie.

Da una solución simple y directa, puedes usar este método como base y cambiar de acuerdo a tus necesidades:

Use el temporizador ya abierto en su programa, el ciclo no necesita ser demasiado largo o demasiado corto, 1 segundo a 1 minuto está bien, siempre que pueda aceptarlo, juzgue directamente si ORE está configurado, el método para juzgar ORE es como sigue:

Función de consulta de biblioteca estándar USART_GetITStatus(USARTx, USART_IT_ORE)

función de consulta de biblioteca hal __HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE);

Si el resultado de la consulta es 1, reinicialice directamente el puerto serie correspondiente. No necesito enumerar las funciones para inicializar el puerto serie. Es el que se llama al principio del programa, como usart1_init(). La biblioteca hal tiene su propio init generado. Si lo vuelves a llamar, el serial el puerto se reiniciará.

La solución de la biblioteca hal se publica a continuación.Tomando el puerto serie 2 como ejemplo, la biblioteca estándar es similar, e incluso la inicialización de la biblioteca estándar es más simple, simplemente llame a la función de inicialización del puerto serie comenzando nuevamente desde principal.

//清理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();
    }

Es así de simple.

Si te es útil, deja un comentario o dale me gusta~

Supongo que te gusta

Origin blog.csdn.net/u013400631/article/details/114594878
Recomendado
Clasificación