http://blog.csdn.net/kevinhg/article/details/40991655

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串口传输数据第一个数据被吞_stm32串口发送数据复位 第一个数据丢失相关推荐

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

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

  2. linux 中kafka发送数据,C++ 向kafka中发送数据

    kafka是一个分布式流处理的平台,通过kafka我们可以发布和订阅流式记录.有关kafka的介绍可以参考官网或者这篇文章https://juejin.im/post/6844903495670169 ...

  3. ajax怎么发送数据给php,ajax怎么发送数据给php

    在网上看了很久,发现数据的利用ajax提交数据到后台其实很简单,但是很多讲解的并不清楚,对于初学者来说,很多真的是看着有点糊涂,拿来直接用,又想去了解怎么回事,其实利用ajax提交数据到后台是非常的简 ...

  4. jsf取js变量_JSF页面中的JS取得受管bean的数据(受管bean发送数据到页面)

    [问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: 删除- http://blog.csdn.net/xxjoy_777/articl ...

  5. STM32串口发送数据

    串口通信经常作为开发调试的工具,所以先介绍下串口通信. 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程 ...

  6. 51单片机串口通信模板_深入理解51单片机串口通信及通信实例

    串口通信的原理 串口通信(SerialCommunications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一 ...

  7. 2.3 基于FPGA的UART协议实现(一)串口信号定义和接线方法-5针串口-9针串口-全功能串口

      通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART.它将要传输的资料在串行通信与并行通信之间加以转换.作为把并行输入信号 ...

  8. java 读取硬件设备发送数据_Java网络编程基础

    1.软件结构 C/S结构:全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷等软件. B/S结构:全称为Browser/Server结构,是指浏览器和服务器结构.常见浏 ...

  9. ESP32设置AP模式与手机连接,并向手机发送数据

    说在前面的话:本文采用的是windows环境,工程是开源一小步之ESP32开发指南教程中的示例工程hx-tcp,主要是为了自己记录吧,如果有解决问题的注意一下.我在开发环境没问题的前提下进行了如下操作 ...

最新文章

  1. java 方法继承方法_Java继承和方法重写
  2. 60 分钟极速入门 PyTorch
  3. 关于session.auto_start报警的问题
  4. “Table .__efmigrationshistory doesn’t exist”的解决方案
  5. react的一些概念
  6. python批处理将图片进行放大实例代码
  7. matlab画2fsk频谱,2fsk信号调制解调频谱的matlab仿真
  8. 计算机设备自动关机,终于发现电脑自动关机的原因及解决方法
  9. linux命令解压文件到指定目录并覆盖,Linux文件压缩和解压缩命令使用详解
  10. iMazing 2.11.7 WinMac 中文版 — iOS设备管理工具
  11. 手机logging什么意思_手机logging怎么关闭
  12. 服务器cpu一直处于100%解决思路
  13. Python调用PyMol
  14. 微软:12代酷睿处理器,须升级win11才能发挥出最大的性能
  15. php opcode逆向还原,[原创]VM代码的还原-插件篇
  16. dashboard 安装harbor
  17. 谷粒学苑-在线教育实战项目-面试总结-简历优化
  18. winmm.lib库
  19. 安装sinaweibo.py
  20. Hadoop集群中MySQL数据库的使用

热门文章

  1. SAP实施顾问参与主数据搜集的四大好处
  2. ABAP业务涉及到的相关数据库表 .
  3. 轻松构建复杂数据集,永洪自服务数据查询功能详解
  4. 王兴最好的半年结束了
  5. 支付宝不止怀有“社交梦”,社区金融才是它的野心所在
  6. 实验报告书 c语言,c语言实验报告书.doc
  7. html复选框读取数据库,checkbox 读取数据库
  8. java 日期 减法_JAVA日期加减运算
  9. mysql换数据存储路径,mysql查看和修改数据存储路径并转移数据
  10. Dosbox汇编环境下debug常用调试命令(二)