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

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

[复制链接]
攻城狮Melo 发布时间:2022-11-4 16:08
一、问题发现: j/ N2 U7 H( _% U6 A/ {7 Y
        在项目中我想通过阻塞的方式接收一段来自串口的数据,于是使用了HAL_UART_Receive函数,但跑起来发现一直超时接收不到。网上使劲搜但没搜到啥有用的结果,那只能自己捣鼓了。一开始怀疑是硬件的问题,于是用示波器直接连到对应的rx脚上,发现数据正常;于是我又尝试使用中断接收的方式,发现也能接收。那么,基本可以确定是HAL_UART_Receive这个函数本身有问题了。* V! B- b$ f9 h1 p9 F
4 b$ O+ `. @* k" O
00834ce53c894b7890f1c7c45c5f0566.png
& ^% v' a: U' [" W( D  L- D: N, `! c" H6 }2 h
二、问题追踪
9 ~4 U& q0 H. m" h9 t        进入debug,并打开使用的USART的寄存器监视(我使用的USART1),发现RXEN一直都是0,ORE一直都是1(这两个都是ISR寄存器中的标志),也就是说,这个函数中没有清除ORE标志的动作,导致串口在收到第一个数据后,再没机会去接收第二个数据;这时候再看HAL_UART_Receive,不论在接受前,还是在接收循环体内,都没看到OREF的清除代码
8 A9 Q2 q# W: Y$ [' f/ w$ b" S
4 K, N3 o; W" q2 |. A) z 507292bafbe44307879c0a3ad6889b43.png ! }% Y! d  h# R) k# P6 s1 t' H

! N4 ?* r' L- {9 T! G2 t( A/ V循环接受中未看到OREF的清除. m. N/ a% G5 S6 o  ~( d2 f  ]* E
8 S( F' N; i( E" y
三、问题解决

$ j8 E: p; O  B4 p7 B  ~1 X7 I$ Y        把USART的ISR(链接文章中为SR)寄存器看一下,再通过上面的解释,问题就可以解决了,只要在HAL_UART_Receive的循环体内添这么一句话  ?: E. g# \) b+ T  f
- ~6 G7 J7 k0 G1 l5 v  p- e
f9e89bbbcf6c4033ac8edf22f9409808.png
+ k: t5 n- ~0 t( L, E# u! B% u( t
  w" E( a8 K4 D3 J  n8 t9 e         现在终于可以正常阻塞接收了!: q- t7 X! [# M8 Q2 [
- i* r' I# L; J8 B/ l
5c2d2fae18eb4b88bcd4b4900cbfb845.png 1 O* V3 U$ U9 G) m" N
0 ?) y' G# {4 o* U4 e# u
        最后,本着不动库函数的原则(防止cube重新生成后忘了修改),建议在某个地方重写这个函数并引用 ) J7 D3 X1 g- x) K
————————————————
! B" T" y6 M. H+ u; s版权声明:balibala
: x1 F0 P% V. c: @  k0 ]1 K' A( x3 n8 q7 s7 z! t2 `
赞 收藏 评论0 发布时间:2022-11-4 16:08

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版