关于stm32的串口通信问题

img

img

img


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

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: 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. 可以根据需要进一步进行数据处理和错误处理。

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


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

百度