stm32串口通信,串口中断接收数据异常

stm32接收数据,接收中断里一直在发。。

img

img


我是想着刚开始发一个字符串,进入接收中断后,单片机发字符串,然后我清除中断标志位,但是他一直在发字符串,刚开始学stm32,不知道是什么原因,大家能否指教一下。

参考GPT的回答和自己的思路,你提供的代码片段有几个问题:

1.if 语句的条件有语法错误。USART_IT_RXNE 应该在 USART_GetITStatus 函数调用的括号外面。应该是这样的:if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)

2.在中断处理程序内部,你不应该调用可能阻塞或需要很长时间才能执行的函数,例如 Usart2_Send。这可能导致中断延迟或丢失,导致不可预测的行为。

3.你没有检查 GSM_Uart2_Data_Num 变量是否超过了 GSM_Uart2_Data 缓冲区的大小。这可能导致缓冲区溢出和数据损坏。

以下是一个已修正的代码,解决了这些问题:

void USART2_IRQHandler(void)
{
    if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {
        unsigned char data = USART2->DR;
        if (GSM_Uart2_Data_Num < GSM_UART2_BUFFER_SIZE)
        {
            GSM_Uart2_Data[GSM_Uart2_Data_Num++] = data;
        }
        USART_ClearFlag(USART2, USART_FLAG_RXNE);
    }
}

在这段代码中,Usart2_Send 函数调用已被删除,仅当有可用空间时,才将接收到的数据添加到缓冲区中。USART_ClearITPendingBit 调用也已被删除,因为它与 USART_ClearFlag 是冗余的。请注意,你应该将 GSM_UART2_BUFFER_SIZE 常量定义为接收缓冲区的大小。

回答不易,还请采纳!!!