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

基于STM32串口数据丢失问题解决

[复制链接]
攻城狮Melo 发布时间:2023-3-26 15:09
在进行串口通讯实验时,一时不仔细可能会发现通讯不正常,数据丢失的现象,包括丢失第一个字符,或只收到最后一个字符等等,本文接下来将就这类问题展开讨论。9 N# H. K1 v+ Y/ x- j6 J+ N# `

2 F( ^& W  `; u, F  P+ x

& ~" |6 S  A, H3 G& ]6 u首先是通过MCU向上位机发送数据:3 _# C! I# ^- [" f" l% f6 }, X
若程序如下图所示,8 n  O; e9 a1 G+ t
3 S4 Y  _0 Y7 a$ k5 e
9ef97ac1bce34dd6ba36f60b8ed43a8c.png
8 s% M9 \: E, k$ ?) G" z% ]
# N& J/ o. u) V- {# [+ Y  t9 U直接发送数据,由于数据缓冲区(TDR)向移位寄存器发送数据是并行发送,时间较快,而从移位寄存器向外传输数据是串行输出,耗时较长,如此可能导致数据丢失多个,或只接收到最后一个,因为后面并行传输的快,还没等数据发送完成,下一个数据就覆盖住了上一个数据。如此,有两种解决办法;一,添加发送数据前一行注释得内容;二,可以在发送数据后面加一小段延时,如此也可以正常发送。
; }( s7 ~/ E* y! D9 o/ F- U; J. C
0 J* e8 p& Q7 ]6 k5 v1 s, I
若编写程序如下所示:
1 d/ o4 }8 d; a
  k# H$ i- b0 X$ _" f, c
47a6270008ca43b48fddf21f8eb8cd11.png - a9 K9 z) e( U# b$ r

( [: i( B2 R9 U. o# M& j4 k* o1 P& r8 v, r; K* J
这样写也存在这一个问题,当开始时USART-FLAG-TC为1时,第一个数据可能就没有延时了,会被第二个数据覆盖,造成第一个字符丢失。如此,有两种方法可以解决,第一,将TC改成TXE,因为TXE可以硬件复位,当读入数据时就自动变为0了,而TC得先读SR寄存器,再读DR寄存器才可以清零。第二,就是在开始得位置先读SR寄存器,如此便可在读入数据时清零。# W' Q0 c, C, ?8 z
+ |$ p, E- G/ _1 e0 x# l6 q
7681fb37103b433399c936a3366ed6ac.png
( N& O* |1 B: r1 e8 `. X# ^
: m" K8 V8 Y" J若在读数据时:& t* S; f- I1 [& o9 V* N0 _
读数据与写数据有一些不同,一般不会丢失第一个数据,因为,当有数据传入时RXNE会置一,当RXNE=1时,移位寄存器中得数据无法传入数据缓冲区(RDR),只能在移位寄存器中,若数据缓冲区中的数据不及时移出,会导致移位寄存器中的数据不断被覆盖,造成数据得丢失。
* \3 L- @6 Y1 A( J————————————————
5 U* o! v2 q" V( p8 S: @版权声明:jj198311如有侵权请联系删除
0 }0 w6 c' k) ~* L3 o: O
! e$ b' i- Y; P0 M, o% v
$ ?2 K. s) U# E5 w$ n6 o0 N+ L2 u. A6 U+ @' C
收藏 评论0 发布时间:2023-3-26 15:09

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版