程序是这样的:
void getonebyte()
{
while(USART_GetFlagStatus(usart1,USART_FLAG_RXNE)==RESET)
{
}
ReceiveData();//从串口接收字节
}
现在我用上位机通过串口1向STM32发数据包,每隔一秒发送128字节的数据包。波特率用的115200,结果每当收到第三个包的时候就进入上面的while死循环出不来了。换了波特率9600还是不行。
纠结了几天了,招架不住了。请各位有经验大侠,指教下,帮忙分析下可能什么情况造成
既然前面都接成功了,后面的问题可能是硬件状态错误所致,也可能是软件处理错误所致,但归根结底还是软件问题。
硬件状态包括USART1的RX使能、GPIO的AFIO模式这些,也就是维持USART1正常的全部充分条件。你的程序里有enable,自然应该有disable的地方。断点查一下有没有误入,在原本需要接受的时候关闭了某些关键功能。
调试开始时打开外设监视窗口,把相关硬件模块的监视窗口都打开。当程序刚刚走完初始化,完全准备好接收第一个字节的时候,截图保存一下各外设监视窗口的实时状态。当程序死在while里的时候,暂停,再次观察外设窗口的状态,看跟截图保存的窗口内容有哪些不同。肯定有不同的,不然就灵异了。依照这个线索再去找。
有时候也可能是不经意间质性了clear flag或者读了DR寄存器,清掉了RXNE标志位,这属于典型的软件错误。可以通过断点、单步、控制PC端发送数据的时间等方式来排查。
最后,你的串口接收函数效率有点低。一方面不启用DMA硬件,造成反复执行ReceiveData();函数所产生的额外开销。另一方面用while死等标志位,不仅浪费CPU时间,而且没有容错性。一旦出点意外整个程序就永远死在这里了。至少要加入超时计数和异常处理机制。 死循环的时候检测下USART_GetFlagStatus(usart1,USART_FLAG_RXNE)返回的值
这个是在中断中做的接收处理么?
如果不是,请换成中断方式
你把while(USART_GetFlagStatus(usart1,USART_FLAG_RXNE)==RESET) 换成
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);试试呢,我的程序是这样接受处理的没遇到你那样的问题。