0

我正在开发一个应用程序,在该应用程序中处理通过 UART 接收的固定长度的命令。

我也在使用 FreeRTOS,处理传入命令的任务被挂起,直到调用 uart 中断处理程序,所以我的代码是这样的

void USART1_IRQHandler()
{
    HAL_UART_IRQHandler(&huart1);
}

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart){
    HAL_UART_Receive_IT(&huart1, uart_rx_buf, CMD_LEN);
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){

    BaseType_t higherTaskReady = pdFALSE;

    HAL_UART_Receive_IT(&huart1, uart_rx_buf, CMD_LEN); //restart interrupt handler

    xSemaphoreGiveFromISR(uart_mutex, &higherTaskReady);
    portYIELD_FROM_ISR( higherTaskReady);   //Relase the semaphore
}

如果发生溢出,我正在使用 ErrorCallBack。现在我成功地捕获了每个正确的命令,即使它们是逐字符发出的。

但是,我试图通过考虑接收到比预期更多的字符的情况来使系统更加防错。

命令长度为 4,但如果我收到例如 5 个字符,那么前 4 个字符会正常处理,但是当收到另一个命令时,它会从最后一个未处理的字符开始,因此在我可以正确处理命令之前需要另外 3 个字符再次。

幸运的是,每当我收到超过 4 个字符时都会调用 ErrorCallback,所以我知道它什么时候发生,但是我需要一种强大的方法来清理 UART 缓冲区,这样以前的字符就消失了。

我能想到的一种解决方案是使用 UART 一次接收 1 个字符,直到它不再接收,但是有没有更好的方法来简单地刷新缓冲区?

4

0 回答 0