C STM32 Uart中断突发传输问题

C STM32 Uart中断突发传输问题,c,stm32,interrupt,uart,stm32f4discovery,C,Stm32,Interrupt,Uart,Stm32f4discovery,我试图在中断模式下实现uart,但显然出了问题。这里是我的问题:我想尽快发送一些字符串(例如:想发送10倍的字符串“test123”),但由于某种原因,这是不可能的(我犯了一些错误,但不知道错误在哪里)。我用的是STM32CubeIDE,单片机是stm32f407vgt6。在第一次成功传输后,代码陷入错误_Handler(),这是不可接受的。当我在每次传输之间使用延迟时,所有字符串都将成功传输,但为什么可以这样做呢 uint8_t TxData[] = "test123\n"; bool fla

我试图在中断模式下实现uart,但显然出了问题。这里是我的问题:我想尽快发送一些字符串(例如:想发送10倍的字符串“test123”),但由于某种原因,这是不可能的(我犯了一些错误,但不知道错误在哪里)。我用的是STM32CubeIDE,单片机是stm32f407vgt6。在第一次成功传输后,代码陷入错误_Handler(),这是不可接受的。当我在每次传输之间使用延迟时,所有字符串都将成功传输,但为什么可以这样做呢

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;
    }
}
uint8\t TxData[]=“test123\n”;
bool flagtxcpltusart=true;
对于(i=0;i<10;i++){`
如果(HAL\U UART\U传输它(&huart3、TxData、strlen(TxData))!=HAL\U正常)
{
错误处理程序();
} 
等待单元Uart发送完成();
重置_Uart _Tx _Complete _Flag();}
无效重置\u Uart\u发送\u完成\u标志(无效)
{
flagtxcpltusart=false;
}
无效等待单元Uart发送完成(无效)
{
而(!flagtxcpltusart){}
}
无效HAL_UART_TXCPLTCALLLBACK(UART_HandleTypeDef*huart)
{
如果(huart->Instance==USART3)
{
flagtxcpltusart=true;
}
}

您必须检查您的UART状态,如果传输线忙,您将出现错误。尝试在每次调用之间插入以下代码

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

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

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

由于在中断上下文中调用了
void HAL\u UART\u TxCpltCallback(UART\u HandleTypeDef*huart)
,因此您应该将完整标志设置为

volatile bool flagtxcpltusart=true


为了确保编译器知道is可能会在正常程序流之外发生更改。

由于在中断上下文中调用了
void HAL\u UART\u TxCpltCallback(UART\u HandleTypeDef*huart)
,您应该将完整标志设置为

volatile bool flagtxcpltusart=true


确保编译器知道is可能会在正常程序流之外更改。

而(!flagtxcpltusart){}
flagtxcpltusart的初始值为true。。。更改
bool flagtxcpltusart=true
bool-flagtxcpltusart=false感谢您的帮助,但这不是解决方案。。在第一个序列中,
bool flagtxcpltusart
可以是false也可以是true。Alex我也这样做,但同样,代码将陷入错误处理程序()您应该清除中断标志。你也检查过HAL_UART_Transmit_IT的返回值了吗?我也检查过。。我检查一下,我得到了HAL_ERROR
void USART3_IRQHandler(void){/*用户代码BEGIN USART3_IRQn 0*/*用户代码END USART3_IRQn 0*/HAL_UART_IRQHandler(&huart3)/*用户代码开始USART3_IRQn 1*/flagtxcpltusart3=true;/*用户代码结束USART3_IRQn 1*/}而(!flagtxcpltusart){}的初始值为true。。。更改
bool flagtxcpltusart=true
bool-flagtxcpltusart=false感谢您的帮助,但这不是解决方案。。在第一个序列中,
bool flagtxcpltusart
可以是false也可以是true。Alex我也这样做,但同样,代码将陷入错误处理程序()您应该清除中断标志。你也检查过HAL_UART_Transmit_IT的返回值了吗?我也检查过。。我检查一下,我得到了HAL_ERROR
void USART3_IRQHandler(void){/*用户代码BEGIN USART3_IRQn 0*/*用户代码END USART3_IRQn 0*/HAL_UART_IRQHandler(&huart3);/*用户代码BEGIN USART3_IRQn 1*/flagtxCompltusART3=true;/*用户代码END USART3_IRQn 1*/}