为什么用串口空闲中断传输时,buf数组就只有第一个被赋值,而用转口传输时数组前几个都被赋值了?
2条回答 默认 最新
关注
不知道你这个问题是否已经解决, 如果还没有解决的话:- 这个问题的回答你可以参考下: 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数组中,并及时清除标志位。具体的步骤如下:
- 首先,在代码中定义一个全局变量buf,用于存储接收到的字符。
c char buf[10]; // 假设buf数组长度为10,根据需要进行调整 int index = 0; // 定义一个索引变量,用于指示存储字符的位置
- 在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);
- 在串口空闲中断的处理函数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; // 重置索引变量 // 进行后续操作,如处理接收到的数据等 } } }
- 在主函数中,通过串口发送函数发送字符或字符串。
c USART_SendData(USART1, 'A'); // 发送字符 USART_SendString(USART1, "Hello"); // 发送字符串
- 可以根据需要进一步进行数据处理和错误处理。
这是一种可能的解决方案,可能需要根据具体情况进行调整和优化。由于无法直接运行和测试该代码,因此无法保证完全正确,请谨慎使用。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥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仿真忆阻器