STM32基础篇:USART(下)

news2024/9/20 11:00:28

双缓冲与连续发送

双缓冲

在发送数据的时候,首先将要发送的字节写入TDR中,然后TDR将此字节发生给移位寄存器,由移位寄存器执行串并转换,通过Tx引脚逐个比特位发送出去。

在此过程中,存在两级缓冲,即双缓冲。首先,第一级缓冲是TDR,TDR会暂时帮我们保管下一个将要发送的数据,第二级缓冲是移位寄存器,缓存正在被发送的数据。

双缓冲与数据的连续发送相关。


连续发送

数据连续发送的过程:

1、例如我们有3个数据,首先将第一个数据写入TDR,由于此时移位寄存器为空,第一个数据直接进入移位寄存器被发送;

2、在第一个数据发送过程中,此时TDR为空,就将第二个数据也写入TDR,等待第一个数据发送完成;第一个数据发送完成后,第二个数据立即自动进入移位寄存器当中,继续进行发送,TDR再次为空;

3、再将第三个数据写入TDR,以此类推,实现数据的连续发送。


数据发送过程中的问题

由于数据写入过快导致的数据丢失问题,即:当我们第一个数据正在移位寄存器中被发送、第二个数据在TDR中排队时,又写入第三个数据,此时第三个数据会直接覆盖掉第二个数据,从而导致第二个数据的丢失。这就是覆盖问题

由覆盖问题可知,过快写入数据会导致数据的丢失,因此我们需要等前面的数据发送完后,再将后面的数据写入TDR。但我们并不知道数据什么时候完成发送,此时需要通过SR(状态寄存器)的一些标志位(TXE、TC)进行判断。


数据接收过程中的问题

问题:什么时候读取数据?

接收数据时,通过Rx引脚去接受高低电平的波形,然后将波形解析成01这样的二进制比特位后,进入RDR寄存器里面供我们读取。但发送方什么时候会发送数据我们是不知道的,因此我们不知道什么时候去读取数据。

如果当我们读取过早时,数据还未进入RDR,此时会读出乱码;当我们读取过晚时,可能导致数据覆盖。

对于此问题同样需要借助SR寄存器中的标志位(RXEN)。


SR寄存器

TXERXNETCPEFENEORE
6543210

TXE标志位反映TDR寄存器当前是不是空的;如果有数据在TDR里面等待被发送,此时读取到TXE的值为0,反之没有数据则为1。

可通过读取TXE标志位,解决覆盖问题:

while(TXE==0);//等待发送数据寄存器为空
TDR=xxx;      //将下一个数据写入TDR

TC标志位:代表发送完成,当TDR和移位寄存器均为空时,TC标志位为1。通过查询TC标志位判断数据是否发送完成。

单个数据发送:

while(TXE==0); //等待TDR清空
TDR=0x5a;      //写入要发送的数据
while(TC==0);  //等待数据发送完成

数据的连续发送:

for(i=0;i<n;i++)
{
    while(TXE==0); //等待TDR清空
    TDR=xxx;      //写入要发送的数据
}

while(TC==0);  //等待数据发送完成

RXNE标志位:接受数据寄存器非空,当RDR中没有数据时,RXNE标志位为0;当RDR中有数据时,RXNE标志位为1。

通过读取RXNE标志位,来接收单个数据:

unsigned int a;   
while(RXNE==00);  //等待RDR有数据需要读取
a=RXNE;           //把数据读取出来

连续接收多个数据:

unsigned int a[10];
for(i=0;i<10;i++)
{
    while(RXEN==0);  //等待RDR有数据需要读取
    a[i]=RDR;        //立即把数据读取出来
}

错误标志位

串口用于传递各种各样的数据,在数据传递的过程中数据就有可能产生错误,在接收方收到数据之后,我们可以通过错误标志位来判断数据有没有错误。

SR(状态寄存器)有4个错误标志位(PE、FE、NE、ORE),每一个标志位代表在接收数据过程中发生了一种类型的错误。

在使用错误标志位时,通常需要先将其备份,因为读取完数据后,标志位又会自动置0。

PE奇偶校验错误

有时我们会把数据帧里面数据位的最后一个比特位拿出来作为校验位,当接收方检测到数据位与校验位奇偶不合时,就会判断发生错误(但不知道具体错误),此时PE标志位由0变1;如果奇偶没有错误,PE标志位依旧为0。


FE帧格式错误

对于数据帧来说,它具有起始位、数据位和停止位这三部分组成,如果我们在接收数据帧的过程中,接收方收到了起始位和数据位,但是没有收到停止位,我们就说发生了帧格式错误。此时,FE标志位由0变1,提示接收方收到的数据帧不完整。


NE噪声错误

数据帧由一个个高电平或低电平来表示,我们将其中的一个个高低电平叫做码元,接收方会采集码元:采集到高电平为1、低电平为0。并且不是简单的采集,它是使用一种叫做过采样的方式进行采集,即采样时使用高频率来采样多次。

对于USART串口来说,使用16倍波特率去采集,每个码元会被采集三次,三次均为同样的电平则表示数据无误。但在数据传递过程中,会引入噪声,导致一个码元采集到的电平不一样,无法判断这个比特位是0还是1。此时NE标志位由0变1。


ORE过载错误

指在数据接收过程中发生了数据覆盖,ORE会由0变1,提示接收方接收过慢,已经有数据倍覆盖了。

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

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

相关文章

[GIS实验]居住环境适宜性评价

目的&#xff1a; 拟购买住宅&#xff0c;需在现有条件下&#xff0c;基于地理空间分析方法和空间认知模型对居住环境进行综合评价。通过该实验掌握基于GIS的地理空间认知方法及土地适宜性评价基本原理与方法。 数据&#xff1a; &#xff08;1&#xff09;人口调查图&#…

记录uni-app横屏项目:自定义弹出框

目录 前言&#xff1a; 正文&#xff1a; 前言&#xff1a;横屏的尺寸问题 最近使用了uniapp写了一个横屏的微信小程序和H5的项目&#xff0c;也是本人首次写的横屏项目&#xff0c;多少是有点踩坑不太适应。。。 先说最让我一脸懵的点&#xff0c;尺寸大小&#xff0c;下面一…

探索Python错误美化:pretty_errors库的魔法之旅

探索Python错误美化&#xff1a;pretty_errors库的魔法之旅 背景&#xff1a;为什么需要pretty_errors&#xff1f; 在Python编程中&#xff0c;错误和异常是不可避免的。然而&#xff0c;Python默认的错误信息往往不够直观&#xff0c;对于新手来说可能难以理解。pretty_erro…

MySQL学习之InnoDB引擎,索引

Mysql中的引擎 我们先来看一下MySql提供的有哪些引擎 mysql> show engines; 从上图我们可以查看出 MySQL 当前默认的存储引擎是InnoDB,并且在5.7版本所有的存储引擎中只有 InnoDB 是事务性存储引擎&#xff0c;也就是说只有 InnoDB 支持事务。 查看MySQL当前默认的存储引…

Transformer之Vision Transformer结构解读

论文地址 代码地址 写在前面 什么是Transformer呢&#xff1f;就是把符号向量化为Token&#xff0c; 再和位置编码求和或者做阿达玛积&#xff0c;最后送入一定层数的Attention Block构成的Encoder和Decoder&#xff0c;就完成了Transformer的基础功能。 那么&#xff0c;把上…

关于模的问题

写代码的时候遇到模的问题 class Solution:def countCompleteDayPairs(self, hours: List[int]) -> int:ans 0t [0 for _ in range(24)]for h in hours:u (24-h%24)%24ans t[u]t[h%24] 1return ans如果写成 u (24-h%24) 是不对的&#xff0c;没有考虑h等于0的情况

【多任务YOLO】 A-YOLOM: You Only Look at Once for Real-Time and Generic Multi-Task

You Only Look at Once for Real-Time and Generic Multi-Task 论文链接&#xff1a;http://arxiv.org/abs/2310.01641 代码链接&#xff1a;https://github.com/JiayuanWang-JW/YOLOv8-multi-task 一、摘要 高精度、轻量级和实时响应性是实现自动驾驶的三个基本要求。本研究…

51单片机(STC8H8K64U/STC8051U34K64)_RA8889驱动TFT大屏_I2C_HW参考代码(v1.3) 硬件I2C方式

本篇介绍单片机使用硬件I2C方式控制RA8889驱动彩屏。 提供STC8H8K64U和STC8051U34K64的参考代码。 【硬件部份】STC8H8K64U/STC8051U34K64 RA8889开发板 7寸TFT 800x480 1. 实物连接图&#xff1a;STC8H8K64URA8889开发板&#xff0c;使用P2口I2C接口&#xff1a; 2.实物连…

怎样制作高品质的电子画册,一看就会

随着数字化进程的加速&#xff0c;电子画册以其便捷的传播方式、丰富的展现形式&#xff0c;越来越受到各类人士的青睐。一份高品质的电子画册&#xff0c;不仅需要有吸引人的内容&#xff0c;更需要有专业的制作技巧。下面&#xff0c;就让我来为您详细解析&#xff0c;如何制…

量子计划 Quark 捯饬

1 蓝牙 系统镜像中具有内置的蓝牙驱动程序&#xff0c;可以按照以下步骤启动蓝牙&#xff1a; bluetoothctl# 进入 bluetoothctl 界面后。运行scan扫描列出附近所有的蓝牙设备 scan on# 复制设备的MAC地址&#xff0c;然后使用以下命令连接到设备&#xff1a; pair A4:xx:xx:…

艺术与技术的交响曲:CSS绘图的艺术与实践

在前端开发的世界里&#xff0c;CSS&#xff08;层叠样式表&#xff09;作为网页布局和样式的基石&#xff0c;其功能早已超越了简单的颜色和间距设置。近年来&#xff0c;随着CSS3的普及&#xff0c;开发者们开始探索CSS在图形绘制方面的潜力&#xff0c;用纯粹的代码创造出令…

32_ConvNeXt网络详解

1.1 简介 ConvNeXt是一种计算机视觉模型&#xff0c;由Meta AI&#xff08;前Facebook AI&#xff09;的研究人员在2022年提出&#xff0c;它旨在探索卷积神经网络&#xff08;CNN&#xff09;在图像识别任务上的潜力&#xff0c;尤其是在与当时流行的Vision Transformer&…

【windows】【系统还原】亦是美kms执行一键关闭defender 之后,windows defender 被卸载了,无论如何都打不开

在那之后&#xff0c;你是否一直无法启动 defender&#xff1f;&#xff1f;&#xff1f; 你是否一直担心电脑的安全问题&#xff1f;&#xff1f; 我也尝试了很多方法 无论是 powershell 执行 dism.exe /online /cleanup-image /scanhealth dism.exe /online /cleanup-ima…

【项目】星辰博客介绍

目录 一、项目背景 二、项目功能 1. 登录功能&#xff1a; 2. 列表页面&#xff1a; 3. 详情页面&#xff1a; 4. 写博客&#xff1a; 三、技术实现 四、功能页面展示 1. 用户登录 2. 博客列表页 3. 博客编辑更新页 4.博客发表页 5. 博客详情页 五.系统亮点 1.强…

c# 开发AutoCAD扩展

在C#中开发AutoCAD扩展涉及使用AutoCAD的.NET API&#xff0c; 利用AutoCAD的功能并创建自定义命令、对话框、块、图层和其他图形元素。以下是一些关键步骤和概念&#xff0c;可以帮助你开始使用C#开发AutoCAD扩展&#xff1a; 准备开发环境 安装AutoCAD&#xff1a;确保你有一…

图片转文档,和同行比我的优势在哪?

图片转Word/Excel | 极简AI工具箱&#xff0c;我自己做的这个在线工具。 图片转word&#xff0c;图片转excel这个功能&#xff0c;我认为还是有不小的需求的。百度上搜索&#xff0c;可以看到不少广告。说明有需求才会有这么多公司愿意花钱打广告。 我这里说的不是单纯的文字识…

CPU工作模式- 保护模式

保护模式 概述 随着软件的规模不断增加&#xff0c;需要更高的计算量、更大的内存容量内存一大&#xff0c;首先要解决的问题是寻址问题&#xff0c;因为16位的寄存器最好只能表示 2 16 2^{16} 216个地址&#xff0c;所以CPU的寄存器和运算单元都要扩展成32位虽然扩展CPU内部…

UDP详细总结

UDP协议特点 UDP是无连接的传输层协议&#xff1b; UDP使用尽最大努力交付&#xff0c;不保证可靠交付&#xff1b; UDP是面向报文的&#xff0c;对应用层交下来的报文&#xff0c;不合并&#xff0c;不拆分&#xff0c;保留原报文的边界&#xff1b; UDP没有拥塞控制&#…

ArrayList.subList的踩坑

需求描述&#xff1a;跳过list中的第一个元素&#xff0c;获取list中的其他元素 原始代码如下&#xff1a; List<FddxxEnterpriseVerify> companyList fddxxEnterpriseVerifyMapper.selectList(companyQueryWrapper);log.info("获取多个法大大公司数据量为&#…

【python 已解决】 ‘ValueError: invalid literal for int() with base 10’解决方案深度解析

【python 已解决】 ‘ValueError: invalid literal for int() with base 10’解决方案深度解析 在Python编程中&#xff0c;ValueError: invalid literal for int() with base 10是一个常见的错误&#xff0c;它通常表明在尝试将字符串转换为整数时&#xff0c;字符串中包含了无…