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

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,一经查实,立即删除!

相关文章

电脑无法启动故障的10种解决方法

电脑无法启动故障的10种解决方法 开机自检时出现问题后会出现各种各样的英文短句,短句中包含了非常重要的信息,读懂这些信息可以自己解决一些小问题,可是这些英文难倒了一部分朋友,下面是一些常见的BIOS短句的解释,大家…

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

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

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

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

c语言 修改密码源码,基于51单片机串口密码修改设计-(源码+电路图)

名称:多功能电子密码锁(使用STM32平台 使用 keiluvision软件,用C语言写代码)系统由STM32单片机核心板电路、7位按键电路、串口电路、电源电路、液晶1602电路、继电器模块电路和LED灯指示电路组成。具体功能:①系统中有3组正确密码&#xff0c…

看了2022华为春季发布会

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

BackGroundWorker用法

在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选。这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作时出现“线程间操作无效: 从不是创建控件的线程访问它”异常。 …

观易先生品三国

今天下了 易中天 易先生的品三国看了第一集 才知三国演义对三国历史曲解多深另外看到一副 剃头师傅的对联 颇有意思说是以关羽为祖师爷 颇有关羽的口气看天下头颅几许 看老夫手段如何转载于:https://www.cnblogs.com/slightboy/archive/2006/08/19/481439.html

TCP如何保证可靠性

TCP传输控制协议 TCP 协议是一种面向连接的,为不同主机进程间提供可靠数据传输的协议。TCP 协议假定其所使用的网络栈下层协议(如IP 协议)是非可靠的,其自身提供机制保证数据的可靠性传输。在目前的网络栈协议族中,在需…

c语言 数组循环移动,如何将一个数组的元素循环左移?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #define SIZE(a) (sizeof(a)/sizeof(a[0]))#define HBIT(a) ((a & 0x00000080) ! 0)#define LBIT(a) ((a & 0x00000001) ! 0)int TAB[] {0x10, 0x71, 0x12, 0x10, 0x10, 0x7C, 0x00, 0x00,0x00, 0x00, …

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

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

生成 excel 直接用 httpServletResponse 输出

之前写过一篇文章 《超详细的java生成excel文件并下载》,该文章虽然够详细,也行得通,但还是有一定的缺陷,该文章可以拆分成两个部分,一是指定位置生成excel文件,二是根据地址下载文件。缺陷的部分是会产生中…

获取网站投资(融资成功)的20个自我检查

1、web2.0提了也白提web2.0这是一个概念,打着web2.0的概念,只是说技术如何如何2.0,战略如何2.0,其实意 义真的不大。投资人需要的是一个网民能够接受,并且很有特点的网站,能够满足网民的某个需求&#xff0…

MYSQL AB复制原理

Mysql复制(replication)是一个异步的复制,从一个Mysql instace(称之为Master)复制到另一个Mysql instance(称之Slave)。实现整个复制操作主要由三个进程完成的,其中两个进程在Slave&…

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程序里总是提示缺少分号;,而明明有分号?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼if(lpNULL)printf("********还没存入图书********\n");else{for(s0;s<5;s){while(( szp->snumber[s]!lp->number )&&(lp->next!NULL))lplp->next;if( szp->snumber[s]lp->number){printf(&…

django使用用户名或手机号码登录

django有自己的认证系统&#xff0c;会自动根据用户名和密码进行验证。如果需要使用用户名或手机登录的话&#xff0c;需要重写django的认证后台&#xff0c;并且设置到配置文件中。 重写django的认证后台 class UsernameMobileAuthBackend(ModelBackend):"""用…

ArcUser 2006第2期拾零

前天收到了上半年的两期ArcUser&#xff0c;其中第二期的主题是Imagery In GIS。这一期的“聚焦”是“Using Imagery”&#xff0c;其中包含5篇文章&#xff1a;Leverage Imagery in ArcGISMobile GIS and Digital PhotomappingThe Key to the Present is the PastUnderstandin…

工作的习惯,看到好收藏下

转载的&#xff0c;读过了感觉有收获&#xff0c;分享下。1&#xff0c;当时公司招了大批应届本科和研究生毕业的新新人类。平均年龄25岁。那个新的助理&#xff0c;是经过多次面试后&#xff0c;我亲自招回来的一个女孩。名牌大学本科毕业&#xff0c;聪明&#xff0c;性格活泼…

TCP传输过程中丢包问题

TCP协议本身是保证传输的数据完整性不会丢数据的。如果通信中发现缺少数据或者丢包&#xff0c;那么&#xff0c;最大的可能在于程序发送的过程或者接收的过程出现问题。例如服务器给客户端发大量数据&#xff0c;Send的频率很高&#xff0c;那么就有可能在Send时发生错误&…