shooting_star77 2023-07-02 23:41 采纳率: 92.3%
浏览 37
已结题

关于stm32的串口通信问题

img

img

img


为什么用串口空闲中断传输时,buf数组就只有第一个被赋值,而用转口传输时数组前几个都被赋值了?

img

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-04 00:37
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7507578
    • 你也可以参考下这篇文章:STM32F103学习笔记之串口简单指令模式,便于调试
    • 除此之外, 这篇博客: STM32F0系列内部高速时钟的配置方法中的 STM32F0系列内部高速时钟配置 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
      	STM32就不多做介绍了,目前普及程度非常广,除了比较基本的F0和F1系列,还有更加高级的F4和F7系列等,正点原子是一个不错的学习平台。在比较基本的应用中,虽然F1比F0更具性价比,但是有的公司为了最大程度节省成本还是会选用F0系列作为MCU,并且可能会省掉外部晶振模块。
      

      STM32时钟系统框图: 在这里插入图片描述 在这种情况下,我们需要配置内部时钟,以内部高速时钟配置为例贴出代码:

        RCC_ClocksTypeDef RCC_ClockFreq; //定义结构体变量,用来查看时钟频率
        RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_OFF);//关闭外部时钟HSE
        RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_12);//PLL倍频至48M HZ
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置SYSCLK
        RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置HCLK
        RCC_PCLKConfig(RCC_HCLK_Div1);//配置PCLK
        RCC_GetClocksFreq(&RCC_ClockFreq);//函数初始化
      
    • 以下回答来自chatgpt:

      根据参考资料,并结合已有知识,我将给出一种可能的解决方案。

      这个问题可能出现的原因是,当使用串口空闲中断进行传输时,如果在接收到第一个字符后没有及时清除串口接收寄存器的标志位,会导致后续的字符无法正确接收和存储在buf数组中。

      解决办法是在串口空闲中断中,接收到一个字符后,需要读取接收寄存器的数据,并将其存储在buf数组中,并及时清除标志位。具体的步骤如下:

      1. 首先,在代码中定义一个全局变量buf,用于存储接收到的字符。

      c char buf[10]; // 假设buf数组长度为10,根据需要进行调整 int index = 0; // 定义一个索引变量,用于指示存储字符的位置

      1. 在USART的初始化代码中使能串口空闲中断,并设置优先级。

      c NVIC_InitTypeDef NVIC_InitStructure; USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); // 使能串口空闲中断 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 设置优先级为最高 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

      1. 在串口空闲中断的处理函数USART1_IRQHandler中,读取接收寄存器的数据,并存储在buf数组中。

      c void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) // 检查串口空闲中断标志位 { USART_ReceiveData(USART1); // 读取接收寄存器的数据(清除标志位) buf[index++] = USART_ReceiveData(USART1); // 读取接收寄存器的数据并存储在buf数组中 if (index >= sizeof(buf)) // 判断是否接收完指定长度的数据 { index = 0; // 重置索引变量 // 进行后续操作,如处理接收到的数据等 } } }

      1. 在主函数中,通过串口发送函数发送字符或字符串。

      c USART_SendData(USART1, 'A'); // 发送字符 USART_SendString(USART1, "Hello"); // 发送字符串

      1. 可以根据需要进一步进行数据处理和错误处理。

      这是一种可能的解决方案,可能需要根据具体情况进行调整和优化。由于无法直接运行和测试该代码,因此无法保证完全正确,请谨慎使用。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月12日
  • 已采纳回答 7月4日
  • 创建了问题 7月2日

悬赏问题

  • ¥15 电子档案元素采集(tiff及PDF扫描图片)
  • ¥15 flink-sql-connector-rabbitmq使用
  • ¥15 zynq7015,PCIE读写延时偏大
  • ¥15 使用spss做psm(倾向性评分匹配)遇到问题
  • ¥20 vue+UEditor附件上传问题
  • ¥15 想做个WPS的自动化代码,不知道能做的起不。
  • ¥15 uniApp,生成安卓安卓包后,黑暗主题中间内容不生效,底部导航正常
  • ¥15 斯坦福自动漂移非线性模型反解
  • ¥15 学习Python如何找兼职
  • ¥15 python结合Matlab仿真忆阻器