STM32串口中断Burst发送问题

STM32 Uart Interrupt Burst transmit problem

我正在尝试在中断模式下实现 uart,但显然出了点问题。这是我的问题:我想尽快发送一些字符串(例如:想发送 10 次字符串 "test123")但由于某些原因这是不可能的(我犯了一些错误但无法理解在哪里是那个错误)。我用的是STM32CubeIDE,mcu是stm32f407vgt6。在第一次成功传输后,代码落入 Error_Handler(),这是不可接受的。当我在每次传输之间使用延迟时,所有字符串都将成功传输,但为什么可以在此 way.Here 中完成是代码

uint8_t TxData[] = "test123\n";
bool flagTxCmpltUsart = true;

for(i = 0; i < 10; i++){`

    if(HAL_UART_Transmit_IT(&huart3, TxData, strlen(TxData)) != HAL_OK)
    {
        Error_Handler();
    } 
        Wait_Unit_Uart_Tx_Is_Complete();
        Reset_Uart_Tx_Complete_Flag();}
void Reset_Uart_Tx_Complete_Flag(void) 
{
    flagTxCmpltUsart = false;
}

void Wait_Unit_Uart_Tx_Is_Complete(void)
{
    while(!flagTxCmpltUsart){}
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART3)
    {
        flagTxCmpltUsart = true;
    }
}

你必须检查你的UART 状态,如果传输线忙,你会得到错误。尝试在每次调用之间插入以下代码;

while (HAL_UART_GetState(&UartHandle) != HAL_UART_STATE_READY){
   //Do Something..
} 

因为void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)是在中断上下文中调用的,你应该将你的完成标志设置为

volatile bool flagTxCmpltUsart = true;

确保编译器知道可以在正常程序流程之外进行更改。