你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STM32使用HAL_UART_Receive()无法接收数据的问题

[复制链接]
攻城狮Melo 发布时间:2022-11-4 16:08
一、问题发现
) q0 L, `# q8 v$ I( K3 D        在项目中我想通过阻塞的方式接收一段来自串口的数据,于是使用了HAL_UART_Receive函数,但跑起来发现一直超时接收不到。网上使劲搜但没搜到啥有用的结果,那只能自己捣鼓了。一开始怀疑是硬件的问题,于是用示波器直接连到对应的rx脚上,发现数据正常;于是我又尝试使用中断接收的方式,发现也能接收。那么,基本可以确定是HAL_UART_Receive这个函数本身有问题了。5 ]8 W/ }# @1 g; }

: W! x* H/ ~5 ^5 n5 Y8 t, i3 @ 00834ce53c894b7890f1c7c45c5f0566.png 5 i! a+ t/ s( i7 a
2 I7 m+ v) ?9 P  K2 O
二、问题追踪
$ a8 P9 A2 x2 c/ X& W3 w3 ?8 ^        进入debug,并打开使用的USART的寄存器监视(我使用的USART1),发现RXEN一直都是0,ORE一直都是1(这两个都是ISR寄存器中的标志),也就是说,这个函数中没有清除ORE标志的动作,导致串口在收到第一个数据后,再没机会去接收第二个数据;这时候再看HAL_UART_Receive,不论在接受前,还是在接收循环体内,都没看到OREF的清除代码6 |, b5 H' s2 S$ |  h6 O

" a. A; |* s/ u5 j. c- D3 J 507292bafbe44307879c0a3ad6889b43.png , v1 B4 `1 u- k, g4 o9 ]. i  w
" M$ z# H( b  u8 T
循环接受中未看到OREF的清除
. E4 Q* q% K5 g, Y1 m
3 y, `& D/ g. Z! }2 Z! x: o三、问题解决
! s% S! l0 b/ v' M% i
        把USART的ISR(链接文章中为SR)寄存器看一下,再通过上面的解释,问题就可以解决了,只要在HAL_UART_Receive的循环体内添这么一句话# p0 h' X( W) }: J0 m
6 C. }5 y# c+ c  R2 a8 n8 u2 x/ @
f9e89bbbcf6c4033ac8edf22f9409808.png & c# ~! M1 r. G7 e  q7 M# G4 `9 m

% k$ \3 H. [. }- _+ N         现在终于可以正常阻塞接收了!/ @4 i! r/ N0 s3 N7 t/ U

$ {+ m8 Y0 W/ O 5c2d2fae18eb4b88bcd4b4900cbfb845.png % q9 Y9 k; R* I! T

3 A( }4 O* |( z& m$ e! }        最后,本着不动库函数的原则(防止cube重新生成后忘了修改),建议在某个地方重写这个函数并引用 % ]. ?% `" T8 j4 V5 h
————————————————$ S2 K4 y# a. o3 W0 p6 x9 z- O
版权声明:balibala
0 v/ ]" R& j; ?! W/ h; k3 u, \+ E, U
收藏 评论0 发布时间:2022-11-4 16:08

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版