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;
确保编译器知道可以在正常程序流程之外进行更改。
我正在尝试在中断模式下实现 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;
确保编译器知道可以在正常程序流程之外进行更改。