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

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 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同