weixin_58189305 2023-03-12 14:24 采纳率: 25%
浏览 79
已结题

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

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

img

img


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

  • 写回答

2条回答 默认 最新

  • dahe0825 2023-03-12 14:41
    关注

    参考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 常量定义为接收缓冲区的大小。

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月20日
  • 已采纳回答 3月12日
  • 赞助了问题酬金15元 3月12日
  • 创建了问题 3月12日

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型