通信教程 | 串口丢数据常见的原因

UART:Universal Asynchronous Receiver / Transmitter,通用异步收发传输器,即我们通常说的串口。

串口是工程师最常用的串行外设之一,但在实际应用中还是会经常遇到各种问题。比如:丢失一字节数据。

今天我们就结合STM32来讲讲UART相关内容,以及容易丢失一字节数据的问题。

UART几个标志位

这里重点说一下UART状态寄存器中的几个标志位:TXE、 TC、 RXNE、 ORE。

af4407de22ef815445e2a6903b9570bf.png

这几个标志位在编程中经常使用,直接用函数库的同学可能没有关心过这几个标志位,数据丢失有可能就是对它们操作不当而导致出错。

TXE:发送数据寄存器为空 (Transmit data register empty)

  • 0:数据未传输到移位寄存器

  • 1:数据传输到移位寄存器

TC:发送完成 (Transmission complete)

  • 0:传送未完成

  • 1:传送已完成

RXNE:读取数据寄存器不为空 (Read data register not empty)

  • 0:未接收到数据

  • 1:已准备好读取接收到的数据

ORE:上溢错误 (Overrun error)

  • 0:无上溢错误

  • 1:检测到上溢错误

UART通信硬件接口

UART通信硬件接口常见有:TTL、 RS232、 RS485。

在编程时需要考虑通信接口方式,在长距离通信的时候,需要考虑线路上的延时,如果操作不当也会导致数据丢失。

1.TTL

TTL比较简单,就是直接连接UART的Tx和Rx引脚,不需要外部转换。如图:

95eb9da894114e9f43a4ec313f4f9587.png

注意:Tx和Rx引脚需要交叉连接。

2.RS232

RS-232标准接口是常用的串行通信接口标准之一,规定逻辑“1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15 V。

选用该电气标准的目的在于提高抗干扰能力,增大通信距离。

f0aa4966a097997fbb34f82d343232df.png

3.RS485

RS485一般采用两线制接线方式,这种接线方式为总线式拓扑结构,在同一总线上可以挂接多个节点。

在低速、短距离、无干扰的场合可以采用普通的双绞线;反之,在高速、长线传输时,则必须采用阻抗匹配(一般为120Ω)的RS485专用电缆;而在干扰恶劣的环境下还应采用铠装型双绞屏蔽电缆。

e4c824559a94da3dba99384676d952c6.png

UART接收丢失数据

UART接收丢失数据与软件和硬件都有可能有关系,下面说几个常见丢失数据的原因及解决办法。

1.接收溢出丢失数据

指未及时取走数据导致溢出错误而丢失数据,通常是发生在大量数据、以查询方式接收数据的情况下。在MCU启动过程中、接收数据过多处理不及时、复杂系统响应不及时等情况都会出现数据丢失的情况。

解决办法:

  • 及时清除溢出错误标志

  • 利用通信协议过滤因数据丢失导致的问题

2.接收中断丢失数据

使用UART中断接收数据相比查询接收数据的方式更常见,中断方式比查询方式响应更及时,但不合理处理同样也会存在数据丢失的情况。

在数据量大时,UART接收中断函数耗时、优先级低等情况下容易丢失数据。

解决办法:

  • 中断函数里减少不必要的耗时

  • 合理分配中断优先级

  • 使能中断前清除标志位

3.时钟误差导致丢失数据

在通信波特率较高的情况下,如果时钟误差加大,很可能导致数据丢失。

解决办法:

  • 使用更高精度晶振

  • 降低通信波特率

UART发送丢失数据

UART发送丢失数据很多工程师都遇到过,通常情况下是传输未完成的原因。

HAL库已经有几年了,但还是有很多工程师都使用标准外设库,这时如果自己封装接口不当,就会存在发送最后一字节数据丢失的问题。

1.UART传输未完成导致数据丢失

如下代码,只考虑非空,但实际传输并未完成。

void UART_SendByte(uint8_t Data)
{while(RESET == USART_GetFlagStatus(USART1, USART_FLAG_TXE));USART_SendData(USART1, Data);
}

但发送非空不代表发送完成,虽然在某些场合更高效,但某些场合就会导致数据丢失。

比如:使用此函数发送之后进入休眠、关闭接收端设备电源等情况下。

解决办法:

等待发送完成:

void UART_SendByte(uint8_t Data)
{while(RESET == USART_GetFlagStatus(USART1, USART_FLAG_TXE));USART_SendData(USART1, Data);while(RESET == USART_GetFlagStatus(USART1, USART_FLAG_TC));
}

如果使用标准外设库,要根据实际情况封装函数,比如发送超时。

或者使用HAL封装的接口,代码包含判断传输完成:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)


2.线路延时导致数据丢失

UART通常会使用232或者485以增加传输距离和增强干扰。但是一旦数据线路太长就存在传输延时的情况,特别是485传输长距离,并使用MCU控制传输方向的情况下。

解决办法:

  • 软件增加延时处理

  • 使用通信协议增加应答机制

3.其他原因

UART应用的场景比较多,有些应用在复杂的工厂,干扰较大从而导致数据丢失;有些应用在温差较大的环境,时钟偏移较大导致数据丢失。

解决办法需要根据实际情况,有针对性解决问题。比如:使用更好的通信线,软件做好容错处理等。

------------ END ------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三次握手 四次握手 与socket函数的关系

我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket&am…

110-简单类型之整数类型和小数类型

简单类型-整数 简单类型-小数 float myFloat12.5f;转载于:https://www.cnblogs.com/wuxiaohui1983/p/9965493.html

看了2022华为春季发布会

我之前在一家智能家居的公司干过,而且我是从0开始做的,所以对这个行业多少还是有点了解,我从技术人角度看一下这场发布会。看到了智能家居的几个产品,然后再想起来我们之前做的东西,嗯,感觉我们做的提前做了…

你们还在用8位单片机吗?

工作这些年,一种从事嵌入式相关的工作,大部分接触的是ARM芯片,不过也有接触到8位单片机的机会,在一些控制领域,8位单片机还是有自己的用武之地的,大家也来说一说,自己还有接触到8位单片机吗&…

TCP拥塞控制详解

为了防止网络的拥塞现象 ,TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成,后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”…

北航博士,研究所月入两万

大家好,看到张老师的一篇文章,说的一位研究生大哥的心路历程,分享给大家。作者:易贝贝https://www.zhihu.com/question/64371326/answer/2251105460文章转自:大鱼机器人北航博士,2019 年 7 月毕业&#xff…

c语言随机迷宫生成器,作为新手该如何快速上手 C++

1.C 实现基数树使用 C 实现Radix树:一种基于二进制表示的键值的查找树,尤其适合处理非常长的、可变长度的键值,Patricia 的基本思想是构建一个二叉树。2.C 实现并行计算的K-Means聚类算法使用 C 实现一个完整的面向对象的可并行K-Means算法。…

薪资是跳出来的,不是涨出来的!

下面的内容是转自朱老师的公众号,他说的观点我是认同的,之前在一个国外的论坛,有个老外总结了程序员的涨薪情况,里面就有提到,如果想拿到比较好的薪水,靠的还是跳槽。当然,他还总结了很多其他方…

团队Alpha冲刺(三)

目录 组员情况组员1(组长):胡绪佩组员2:胡青元组员3:庄卉组员4:家灿组员5:凯琳组员6:丹丹组员7:家伟组员8:政演组员9:鸿杰组员10:刘一好组员11:何…

快速排序非递归算法c语言实现,数据结构与算法----3.5 非递归的快速排序方法

[c]代码库#include using namespace std;#include using namespace std;typedef int KeyType;struct LElemType{KeyType key;};struct SElemType{int a;int b;};struct SList{LElemType *r;int length;};const int StackInitSize10;const int StackInc15;struct SStack{SElemTy…

C++类中成员变量的初始化总结

C类中成员变量的初始化总结 1. 普通的变量: 一般不考虑啥效率的情况下 可以在构造函数中进行赋值。考虑一下效率的可以再构造函数的初始化列表中进行。 1 class CA 2 { 3 public: 4 int data; 5 public: 6 CA(); 7 }; 8 9 CA::CA():data(0) //……#1……

今天把房子定下来了

今天同学L跟我说,今天付了定金,把买房子的事给定下了。先说下疫情这两年的房价在疫情之前,2019年那时候,深圳经历了一波房价上涨,那时候的房价上涨是我完全没有预料到的,但是在2015年房价的那一波房价上涨&…

android群英传 自定义滑动view,Android群英传学习之路-View的滑动

滑动效果是如何产生的?滑动一个View从本质上来说就是移动一个View,改变其当前的坐标。所以,想要滑动一个View,就必须监听该View的触摸事件,并且根据事件的坐标,不断的改变View的坐标从而实现View的滑动。An…

艹,正则表达式!

大家好,我是球哥,转发良许同学的一篇文章。不知道大家有没有被正则表达式支配过的恐惧?看着一行火星文一样的表达式,虽然每一个字符都认识,但放在一起直接就让人蒙圈了~你是不是也有这样的操作,比如你需要使…

Linux Centos安装步骤

在虚拟机VMware10上安装Centos系统步骤 (1)首先需要创建一个虚拟机,选择操作系统,进行一系列的硬件配置,选择Centos系统镜像 虚拟机创建完成 虚拟机创建完成后,重新启动虚拟机,就会自动开始安装CentOS系统的…

通信PK电子,谁牛?

工程师很多都有强迫症,有的是拆解强迫症,有的是排线布线强迫症,至今还记得第一堂焊电路板的课上,有同学把跳线排排焊,期末考获得了光荣的A。论起排线布线的手艺,早前,德国弱电工程师的完美布线让…

[机器视觉] SIFT特征-尺度不变特征理解

SIFT特征-尺度不变特征理解 简介 SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局…

harmonyos手机开发者beta,HarmonyOS 手机应用开发者 Beta 版到来,对开发者意味着什么...

北京时间12月16日,HarmonyOS手机开发者Beta活动在北京国贸开启,这场活动现场的人潮涌动也足以说明一切——用户和开发者对HarmonyOS手机应用开发者Beta版期待已久。作者 | 贾凯强头图 | 华为官方提供打破手机单设备限制,为万物互联而生在活动…

你确定不反编译 likely 看看?

大家好,我是写代码的篮球球痴,下面推荐飞哥的一篇文章,觉得对大家很有帮助,希望大家先看看再扔到收藏夹吃灰,转发不转发看大爷们心情咯!今天我给大家分享一个内核中常用的提升性能的小技巧。理解了它对你一…

看完这篇文章,会让你对电容的作用更明白!

电容是电路设计中最为普通常用的器件,是无源元件之一,有源器件简单地说就是需能(电)源的器件叫有源器件,无需能(电)源的器件就是无源器件。电容的作用和用途一般都有好多种,如:在旁路、去耦、滤波、储能方面的作用&…