【嵌入式开发学习】__串口丢数据的几个常见原因

news2024/12/29 17:23:23

前言

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

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

一、UART几个标志位

这里重点说一下UART状态寄存器中的几个标志位:TXETCRXNEORE

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

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通信硬件接口常见有:TTLRS232RS485

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

1. TTL

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

注意:TxRx 引脚需要交叉连接。

2. RS232

RS-232标准接口是常用的串行通信接口标准之一,规定

逻辑“1”的电平为:-5V~-15 V;逻辑“0”的电平为:+5 V~+15 V

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

3. RS485

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

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

三、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应用的场景比较多,有些应用在复杂的工厂,干扰较大从而导致数据丢失;有些应用在温差较大的环境,时钟偏移较大导致数据丢失。

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


(* ̄︶ ̄)创作不易!期待你们的 点赞收藏评论喔。 

本文来源网络,免费分享知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除!

 

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

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

相关文章

支付卡行业(PCI)PIN安全要求和测试程序 7个控制目标、33个要求及规范性附录ABC 密钥注入-PCI认证-安全行业基础篇4

概述 用于在ATM和POS终端进行在线和离线支付卡交易处理期间,对个人身份号码(PIN)数据进行安全管理、处理和传输。 该标准具体包括 7 个控制目标和 33 个安全要求, 标准的结构分为标准主体部分,标准附录(N…

聚会娱乐喝酒游戏小程序源码系统 可开流量主 带完整的搭建教程

今天罗峰来给大家分享一款聚会娱乐喝酒游戏小程序源码系统 。在聚会娱乐活动中,喝酒游戏是一种非常受欢迎的活动方式。但是,往往由于缺乏有效的组织和规则,导致游戏的进行不够顺畅,甚至出现混乱的情况。因此,开发一款能…

Linux提权方法总结

1、内核漏洞提权 利用内核漏洞提取一般三个环节:首先对目标系统进行信息收集,获取系统内核信息及版本信息 第二步,根据内核版本获取对应的漏洞以及exp 第三步,使用exp对目标进行攻击,完成提权 注:此处可…

Spring Security使用总结三,编写一个注册页面,不知道你有没有强迫症

不像先有鸡还是先有蛋这种话题,对于系统来说必须要先注册再登录,所以这一章主要就是讲注册,对于注册来说首先就是要有一个注册的页面,从系统的安全角度去考虑,这个注册页面可以是系统自带的注册页面,也可以…

学习笔记|构建一元线性回归模型|方差分析|方差齐性|检验残差正态性|规范表达|《小白爱上SPSS》课程:SPSS第二十讲: 一元线性回归分析怎么做?

目录 学习目的软件版本原始文档一元线性回归分析一、实战案例二、统计策略三、SPSS操作四、结果解读第一个表格为模型摘要第二表格为方差分析表第三个表格为模型系数第四张散点图(主要检验方差齐性) 第五张直方图和P-P图(检验残差正态性&…

PHP语言、B/S手术麻醉临床信息管理系统源码

手术麻醉临床信息管理系统有着完善的临床业务功能,能够涵盖整个围术期的工作,能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施,能够规范麻醉科的工作流程,实现麻醉手术过程的信息数字化,自动生…

虚析构函数

1)类指针指向本身的对象 Son *xiaoming new Son; delete xiaoming; 构造及析构顺序: 父类构造 子类构造; 子类析构; 父类析构。 2)父类指针指向子类对象,,父类析构函数不是虚函数 Father *father new Son; delete f…

Redis-持久化

RDB快照(snapshot) (1)Redis将内存数据库快照保存dump.rdb的二进制文件中 (2)Redis将内存flush到磁盘文件的默认策略: N秒内数据集至少有M个改动 (3)Redis允许手动flush&…

Android Studio(RecyclerView)

前言 ListView的缺点&#xff0c;在RecyclerView得到了补充改善&#xff08;横纵向排列子元素、多列布局等等&#xff09; 代码 前面在适配器章节已经介绍了其对应的适配器&#xff0c;这里就简单展示一下多列布局的页面效果和相关代码 <androidx.recyclerview.widget.Recyc…

干货|AI辅助完成论文的正确打开方式!

论文写作中可能遇到问题 1. 选题问题&#xff1a;是否无法确定研究方向和选择合适的题目&#xff1f; 2. 文献综述问题&#xff1a;是否困惑如何进行文献调研和综述&#xff1f; 3. 方法论问题&#xff1a;是否不知道该选择何种研究方法&#xff1f; 4. 数据处理问题&#…

【Kubernetes部署】通过Kubeadm部署Kubernetes高可用集群

Kubeadm 一、kubeadm部署思路二、基本架构2.1 资源分配2.2 系统初始化操作&#xff08;所有节点&#xff09;2.2.1关闭防火墙、selinux和swap分区2.2.2 修改主机名&#xff0c;添加域名映射2.2.3 内核相关2.2.4 加载ip_vs模块2.2.5 时间同步 三、部署docker3.1 通过yum安装dock…

10个免费3D模型网站

作为一名独立游戏开发者,自己创建图形、配乐、动画和更多东西是相当具有挑战性的。 创建资产所需的成本和时间有时是许多游戏开发商无法承受的。 这就是他们选择在互联网上搜索免费内容的原因。现在,在浩瀚的内容海洋中获得如此免费的东西有点困难。 本文列出了 10 个免费 3D…

C语言34种运算符的用法解析

C 算术运算符 操作员运算符的含义加法或一元加法-减法或一元减法*乘法/分配%除法后的余数&#xff08;模除&#xff09; // 算数运算符的使用 #include <stdio.h> int main() {int a 9,b 4, c;c ab;printf("ab %d \n",c);c a-b;printf("a-b %d \n…

R语言环境下使用curl库做的爬虫代码示例

curl库是一个用于传输数据的工具和库&#xff0c;它支持多种协议&#xff0c;包括HTTP、FTP、SMTP等。在爬虫中&#xff0c;curl库可以用来获取网页内容&#xff0c;从而实现爬取网页的功能。通过设置curl的选项&#xff0c;可以实现对网页的请求、响应、重定向等操作。在使用c…

【前段基础入门之】=>CSS3新特性 @keyframes 动画

导语 在 CSS3 新特性中&#xff0c;新增了动画效果 的定义方式&#xff0c;这使得我们可以通过使用 CSS&#xff0c;从而开发出精美的动画效果&#xff0c;所以本章节&#xff0c;就来详细聊一聊如何通过 CSS 去创建一个动画效果案例 帧 **学习动画之前&#xff0c;我们得先了…

windows11 画图软件调整图片大小

win11自带的画图功能可以调整图片的大小和尺寸 搜索 画图&#xff0c;点击画图应用&#xff0c;打开图片 要把图片调整成800*1200。先打开文件菜单 选择图像属性 此处可以调整图片的尺寸和大小&#xff08;非等比例调整&#xff09; 选择图像下调整大小&#xff08;等比例调整…

什么叫SSH?原理详解,看这一篇就够了!

你们好&#xff0c;我的网工朋友。 SSH是一种加密的网络安全协议&#xff0c;用于安全地远程登录和执行命令。 目前SSH协议已经被全世界广泛使用&#xff0c;大多数设备都支持SSH功能。 但你真的会用吗&#xff1f; 今天就从SSH是什么、怎么用出发&#xff0c;给你详解一下之…

用AI魔法打败AI魔法

全文均为AI创作。 此为内容创作模板&#xff0c;在发布之前请将不必要的内容删除当前&#xff0c;AI技术的广泛应用为社会公众提供了个性化智能化的信息服务&#xff0c;也给网络诈骗带来可乘之机&#xff0c;如不法分子通过面部替换语音合成等方式制作虚假图像、音频、视频仿…

知识注入以对抗大型语言模型(LLM)的幻觉11.6

知识注入以对抗大型语言模型&#xff08;LLM&#xff09;的幻觉 摘要1 引言2 问题设置和实验2.1 幻觉2.2 生成响应质量 3 结果和讨论3.1 幻觉3.2 生成响应质量 4 结论和未来工作 摘要 大型语言模型&#xff08;LLM&#xff09;内容生成的一个缺点是产生幻觉&#xff0c;即在输…

el-select多选以tag展示时,超过显示长度以...省略号显示,且在一行展示

效果&#xff1a; 代码&#xff1a; <span>系统词典维度&#xff1a;</span><el-selectv-model"dNum"placeholder"请选择"multiplecollapse-tags //设置collapse-tags属性将它们合并为一段文字size"small"style"width:160p…