一、问题发现
在项目中我想通过阻塞的方式接收一段来自串口的数据,于是使用了HAL_UART_Receive函数,但跑起来发现一直超时接收不到。网上使劲搜但没搜到啥有用的结果,那只能自己捣鼓了。一开始怀疑是硬件的问题,于是用示波器直接连到对应的rx脚上,发现数据正常;于是我又尝试使用中断接收的方式,发现也能接收。那么,基本可以确定是HAL_UART_Receive这个函数本身有问题了。
文章来源:https://www.toymoban.com/news/detail-510163.html
二、问题追踪
进入debug,并打开使用的USART的寄存器监视(我使用的USART1),发现RXEN一直都是0,ORE一直都是1(这两个都是ISR寄存器中的标志,关于USART的寄存器介绍,可看看这篇文章STM32单片机,UART的寄存器配置以及工作原理),也就是说,这个函数中没有清除ORE标志的动作,导致串口在收到第一个数据后,再没机会去接收第二个数据;这时候再看HAL_UART_Receive,不论在接受前,还是在接收循环体内,都没看到OREF的清除代码
循环接受中未看到OREF的清除
三、问题解决
把USART的ISR(链接文章中为SR)寄存器看一下,再通过上面的解释,问题就可以解决了,只要在HAL_UART_Receive的循环体内添这么一句话
现在终于可以正常阻塞接收了!
最后,本着不动库函数的原则(防止cube重新生成后忘了修改),建议在某个地方重写这个函数并引用 。如果文章中有什么不对的地方,欢迎指正!文章来源地址https://www.toymoban.com/news/detail-510163.html
到了这里,关于关于STM32使用HAL_UART_Receive()无法接收数据的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!