- 2024-12-27
-
发表了主题帖:
关于串口收发字符串中内层while卡住问题的相关总结
基于stm32f108zet6,中usart(没有用到同步功能)接收字符串中while的嵌套中有感
//接受一个字符串
void USART_ReciveString(uint8_t *buffer, uint8_t *size)
{
while((USART1->SR & USART_SR_IDLE) == 0)
{
uint8_t i = 0;
buffer[i] = USART_ReciveChar();
i++;
}
*size = i;
}
//会进入函数USART_ReciveString()内部死循环卡住;当接收完一个最后一个字符时,IDLE不会清零,会再一次进入外层while调用函数,此时没有下一个字符发送RXNE持续为0
//接收一个字符
uint8_t USART_ReciveChar(void)
{
while((USART1->SR & USART_SR_RXNE) == 0)
{
}
return (USART1->DR);
}
上述代码中涉及到当最后一位数据发送完毕后总线上不会立刻检测到空闲帧从而导致进入外层循环,但没有下一位数据到达接受寄存器而卡在内层循环中,从而导致bug,其根本原因在于内层循环卡住导致外层循环无法检测总线空闲帧变化,故解决方法即为将条件下放到内层循环,让内层循环来检测空闲帧,从而达到实时检测空闲帧变化,我个人将其命名为信息下放法。改进代码如下
void USART_ReciveString(uint8_t *buffer, uint8_t *size)
{
uint8_t i = 0;
while(1)
{
while((USART1->SR & USART_SR_RXNE) == 0)
{
if((USART1->SR & USART_SR_IDLE) != 0)
{
*size = i;
return;
}
}
buffer[i] = USART1->DR;
i++;
}
}
注:改进代码非本人原创,上述结论是根据改进代码所总结
-
回复了主题帖:
关于近期学习stm32的一些疑惑望大佬解答,诚心发问
wangerxian 发表于 2024-12-26 20:19
基本外设学完后,可以尝试DIY一些小东西,只有在项目上用了,你才会记得更深刻。
感谢
-
回复了主题帖:
关于近期学习stm32的一些疑惑望大佬解答,诚心发问
电子烂人 发表于 2024-12-27 09:24
单看视频没用,建议买个C8T6上手做
比如你在看UART,可以做个激光雷达的数据回传
感谢
-
回复了主题帖:
关于近期学习stm32的一些疑惑望大佬解答,诚心发问
Jacktang 发表于 2024-12-27 07:26
找一些实际的项目来练习,比如制作一个简单的温度监控系统、LED闪烁器、串口通信的数据传输等。
可以从 ...
感谢
-
回复了主题帖:
关于近期学习stm32的一些疑惑望大佬解答,诚心发问
haocede 发表于 2024-12-27 13:37
楼主你好,你是写代码的吗,请问最近你有没有找到什么好用的免费资料,求楼主分享一下,我也是从事软件相关 ...
在b站上找的视频尚硅谷的,当然你也能去试试主流的些原子或者野火这
- 2024-12-26
-
发表了主题帖:
关于近期学习stm32的一些疑惑望大佬解答,诚心发问
主要是关于宏观方面不是细节的知识点,我目前的情况是刚刚学完中断,正在看usart/uart串口通信,对于配置时钟,io口,初始化这些基本能理解,能查懂看过手册能自己配虽然可能有错误,但是能配出来去找错误改进,但是对于代码的核心逻辑部分总感觉缺点什么,就是学了就忘,没有题目巩固,我现在在学串口感觉中断里的寄存器我都忘得差不多了,我理解的复习应该是输出,去通过一些项目来巩固这些知识,而不是一遍遍的反刍知识点,但是我目前基本不知道有什么系统性的模块练习项目,课程中的一些项目不断的做总觉得学的假假的,感觉之接触到了形,没有触及到神,稍微换换壳,我就不会了。学的越多忘的越多我懂,但是有一种不知道怎么去克服忘记的无力感。综上我想求助大佬们是否有过这种时期,如何度过,如何检索一些和自己所学知识相关的项目去实现以及改进,菜鸟求助!!!求大佬解答!!!