STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失。错误依旧。 
故障排除过程: 
1、刚开始怀疑是接收端的错误,我是使用电脑串口,运行串口辅助调试工具接收,换成其他软件后,发现故障依旧,而且电脑软件一直是开启状态,不像和电脑软件有关。 
2、使用单步调试,单步运行各个发送指令,都正常。能收到0x01 0x02 0x03 0x04的数据。间接的排除了不是电脑软件的问题,而是其他的错误。 
3、单步调试运行虽然正常了,但连续运行时,错误依旧。现在有点摸不到头绪了,单步运行正常,看起来编程没有出错,那故障在哪里呢?测试程序如下 
      USART_SendData(USART2, 0x01);                                 //A 
      while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);   //B 
      USART_SendData(USART2, 0x02);                                 //C 
      while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); 
      USART_SendData(USART2, 0x03); 
      while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); 
      USART_SendData(USART2, 0x04); 
      while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); 
4、猜测,也许是因为某个特殊原因,使第二个数据覆盖了首个数据,使得首个数据丢失。假设:在执行B指令时,USART的 TC 状态位==SET,那么就会紧接着执行C指令,也就有可能发生数据的覆盖。于是,在A指令前,加入如下指令:USART_ClearFlag(USART2,USART_FLAG_TC); 
5、加入上一条指令后,运行,错误消失了。说明上一个假设,应该是成立的。 
6、查阅stm32f10x参考手册,找到这样一句话: 
      TC:发送完成 
      当包含有数据的一帧发送完成后,由硬件将该位置位。如果USART_CR1中的TCIE为1,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。TC位       也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。 
      0:发送还未完成;1:发送完成。 
7、注意到这一句:由软件序列清除该位(先读USART_SR,然后写入USART_DR)。 也就是说,要先read USART_SR,然后write USART_DR,才能完成TC状态位的清除。而硬件复位后,串口发送的首个数据之前没有read SR的操作,是直接write DR,也就是说,TC没有被清除掉。 说明第4步的猜测是对的。 
8、那么,应该把指令A前面加的USART_ClearFlag(USART2,USART_FLAG_TC); 改为USART_GetFlagStatus(USART2, USART_FLAG_TC);,应该也能消除错误。测试后证实,确实如此,在发送首个数据之前,先读取一下USART_SR,那么就不会出现首个数据丢失的情况了。 
9、总结:硬件复位后,串口发送首个数据之前,先读取一下USART_SR,则能够保证首个数据发送时,不出现覆盖的情况。当然,也有别的方法,比如先清除TC状态位,或是,在write USART_DR之后,加入一个小延时,让数据发送完毕,应该也能间接排除这个错误。

STM32串口第一个字节丢失问题的分析过程相关推荐

  1. stm32串口传输数据第一个数据被吞_STM32串口第一个字节丢失问题的分析过程

    STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据 ...

  2. STM32的串口函数_库函数USART_SendData问题和解决方法--硬件复位导致第一个字节丢失

    本文转自:http://blog.sina.com.cn/s/blog_717116870102vb4c.html 个人记录: 昨天做串口实验的时候一直没有成功的原因,连续调用USART_SendDa ...

  3. STM32串口第一字节消失或者误码的原因和解决方案

    现象:stm32复位之后串口打印的第一个字节误码或者消失. 误码原因:误码多是由于端口初始化有问题.使用ST官方v3.5的标准库时,对串口输出端口进行了重复初始化. 如下代码: /* PA[15:0] ...

  4. unity 串口数据第一个字节丢失_FPGA串口实战篇

    欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 前些天为了支援朋友,为其调试了一款激光测距仪,而该测距仪与FPGA的数据通信方式为串口,波特率为 ...

  5. STM32串口首字节丢失问题

    烧录程序复位后,第一个发送或者接收的字符串,会出现字节丢失问题. 解决方法:在主函数加一个适当的延时:例如100ms. 原因:程序运行太快,串口速度赶不上程序运行速度.

  6. stm32串口传输数据第一个数据被吞_stm32串口发送数据复位 第一个数据丢失

    http://blog.csdn.net/kevinhg/article/details/40991655 STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成 ...

  7. stm32串口自定义协议接收一串十六进制数据(将其中两个字节转化为十进制数据)+部分串口基础知识

    文章目录 一.基本储存单元 二.通信协议 (一)并行通信和串行通信 (二)三种工作方式 (三)收发数据同步或异步传输 (四)通信速率 三.串口通信协议 (一)RS232 (二)USB转串口(TTL标准 ...

  8. 关于RS485通讯中使用STM32串口以DMA方式发送数据丢失字节的问题

    1.开发平台 计算机操作系统:WIN7 64位: 开发环境:Keil MDK 5.14: MCU:STM32F407ZET6: STM32F4xx固件库:STM32F4xx_DSP_StdPeriph ...

  9. STM32串口寄存器操作(转)

    源:STM32串口寄存器操作 //USART.C/*************************************************************************** ...

最新文章

  1. 任意排列、组合终极Shell脚本
  2. oracle10g sql跟踪,SQL性能的度量 - 语句级别的SQL跟踪autotrace
  3. python个人博客搭建说明书_技术分享|利用Python Django一步步搭建个人博客(二)...
  4. 田志刚:人跟人差距怎么那么大呢?
  5. java语言中的数据类型_Java语言中关于数据类型的一些总结
  6. 肝了一个月,终于搞到了 30 页的 Python 进阶面试题
  7. zabbix 搭建笔记
  8. 如何监视Java EE数据源
  9. Android设计模式之——Builder模式
  10. 手机编写python程序_Python实现自动上京东抢手机
  11. 【高斯和拉普拉斯为什么分别对应L2和L1?】差分隐私系统学习记录(五)
  12. Java乘法计算错误,Java JRE致命错误:乘法过多
  13. cdr怎么做文字路径_抖音短视频中边说过边出现文字的是怎么做的?教程如下
  14. Java疯狂讲义(第8章——泛型)(读书笔记)
  15. 安装office2010常见的提示错误解决办法
  16. 反恐精英代码_Steam永久降价通知!绝地求生史低促销!CS:GO源代码泄漏!
  17. Word怎么转换成长图
  18. 8.13.2020 excel表格筛选按钮位置设置
  19. 常见面试题之布隆过滤器的使用案例(海量数据)
  20. 07 Python数据类型详解

热门文章

  1. MATLAB在AI方面的应用工具
  2. 第十五届全国大学生智能车竞赛线下比赛成绩和奖项
  3. 公众号留言-2020-4-3
  4. oracle数据库中insert,【Oracle】sql插入之 insert all、insert first
  5. 安徽师范大学信息计算机学院,安徽师范大学数学计算机科学学院导师介绍:罗永龙...
  6. mysql事务处理 begin_mysql 事务处理
  7. 字典生成_Python数据字典生成工具详解
  8. linux下用c 开发web,用C一步步开发web服务器(2)
  9. python文档字符串_结构化的python文档字符串,对IDE友好
  10. php controller 间调用,php – 在CodeIgniter中的另一个Controller中调用Controller函数