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

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日

悬赏问题

  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器