16252|3

55

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于stm32的串口,为什么经常看见串口发送的第一个字节数据会丢失及解决办法 [复制链接]

     搞指纹识别模块遇到的问题!
      用串口调试助手发现每次发送出去的数据第一个字节都会丢失,后来研究发现:

      1、串口的SR寄存器的复位值就是0x00c0,而我的程序是
      /*
    功能:串口发送
    */
    void Txd_Byte(u8 data)
   {
USART1->DR=data;
while((USART1->SR&0X40)==0);
    
   }
     我判断的是TC位,就是说要等到数据到移位寄存器中完成后,再发送第二帧数据,但是,由于SR寄存器的复位值是0x00c0,所以首先TC位就是置1的,所以当第一次数据写入DR寄存器中的时候头一个while没起作用,然后第二个数据来了就把第一个数据覆盖了,这样我们经常发现,串口的第一个数据丢失了!

     搞懂了为什么,这样解决问题就好办了!
     最简单的办法就是直接判断TXE为,即把上面的0x40改成0x80就行;
     第二个就是先读SR的TC位,这样第二次判断的时候,就已经清零了,只有等待数据到移位寄存器肿了,第二次数据来的时候就不会覆盖第一次的数据了

     其实最好还是判断TXE位,当然,如果在多缓冲器的情况下,还是判断TC位比较好!
此帖出自stm32/stm8论坛

最新回复

串口没有问题的。  详情 回复 发表于 2012-5-16 02:38
点赞 关注(3)
 

回复
举报

4008

帖子

0

TA的资源

版主

沙发
 

我理解你丢数据的情况出现在未发送完就覆盖了。发送前应该确保不是正发送状态。

要是只丢第一个的话你改成do { } while就行了。

[ 本帖最后由 huo_hu 于 2012-4-8 22:27 编辑 ]
此帖出自stm32/stm8论坛
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

回复 沙发 huo_hu 的帖子

我改成do while的形式有问题。请问你试过么。
此帖出自stm32/stm8论坛
 
 

回复

4008

帖子

0

TA的资源

版主

4
 

回复 板凳 genius_001 的帖子

串口没有问题的。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表