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