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

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

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


首先是通过MCU向上位机发送数据:
若程序如下图所示,

9ef97ac1bce34dd6ba36f60b8ed43a8c.png

直接发送数据,由于数据缓冲区(TDR)向移位寄存器发送数据是并行发送,时间较快,而从移位寄存器向外传输数据是串行输出,耗时较长,如此可能导致数据丢失多个,或只接收到最后一个,因为后面并行传输的快,还没等数据发送完成,下一个数据就覆盖住了上一个数据。如此,有两种解决办法;一,添加发送数据前一行注释得内容;二,可以在发送数据后面加一小段延时,如此也可以正常发送。

若编写程序如下所示:

47a6270008ca43b48fddf21f8eb8cd11.png


这样写也存在这一个问题,当开始时USART-FLAG-TC为1时,第一个数据可能就没有延时了,会被第二个数据覆盖,造成第一个字符丢失。如此,有两种方法可以解决,第一,将TC改成TXE,因为TXE可以硬件复位,当读入数据时就自动变为0了,而TC得先读SR寄存器,再读DR寄存器才可以清零。第二,就是在开始得位置先读SR寄存器,如此便可在读入数据时清零。

7681fb37103b433399c936a3366ed6ac.png

若在读数据时:
读数据与写数据有一些不同,一般不会丢失第一个数据,因为,当有数据传入时RXNE会置一,当RXNE=1时,移位寄存器中得数据无法传入数据缓冲区(RDR),只能在移位寄存器中,若数据缓冲区中的数据不及时移出,会导致移位寄存器中的数据不断被覆盖,造成数据得丢失。
————————————————
版权声明:jj198311如有侵权请联系删除



收藏 评论0 发布时间:2023-3-26 15:09

举报

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