首页 > 其他分享 >UART——通用异步接收发送器

UART——通用异步接收发送器

时间:2024-09-14 20:28:33浏览次数:14  
标签:异步 UART 连接 奇偶校验 传输 接收 发送器 设备

数字系统是以 1 和 0 的形式共享和存储信息。要与具有不同架构的多个设备共享此信息,我们需要一种通用的数据交换方法。这就是各种通信协议发挥作用的地方,其中之一就是通用异步接收器发送器 ( UART )。它是嵌入式电子产品中最常用的通信协议之一。它是一种串行、全双工、异步和板对板通信协议。在了解协议之前,让我们先分解一些主要关键字。

·串行通信: 对于串行通信,仅需一个或两个连接即可发送或接收数据。数据接收和传输一次一位或按顺序进行。
·并行通信: 对于并行通信,存在多条线路用于数据交换。用于传输或接收数据的线路数量称为设备的总线宽度。在下图中,您可以确定总线宽度为 8 位。所有 8 位同时传输。

UART详解

由于 UART 是一种全双工异步通信协议,因此数据的发送和接收可以同时进行。因此,我们需要单独的引脚来传输和接收数据。我们有用于传输的 TX 引脚和用于数据接收的 RX 引脚。从一个设备的 TX 端口发送的数据由另一个设备的 RX 端口接收,反之亦然。因此,设备之间的连接是 TX1 连接到 RX2,TX2 连接到 RX1 以进行通信。下图说明了如何完成 UART 协议的连接。
并行与串行通信
异步通信: 在异步通信中,设备不共享公共时钟来同步数据传输。相反,它们同意相同的传输速率并配置设备的内部时钟来捕获或传输数据。
全双工通信: 在全双工类型的通信中,存在单独的线路以同时进行发送和接收。
从下图中,您可以看到设备并行发送和接收数据。
全双工通信
现在我们已经了解了一些重要术语的基本概念,我们可以继续了解 UART 的工作原理。

UART详解

由于 UART 是一种全双工异步通信协议,因此数据的发送和接收可以同时进行。因此,我们需要单独的引脚来传输和接收数据。我们有用于传输的 TX 引脚和用于数据接收的 RX 引脚。从一个设备的 TX 端口发送的数据由另一个设备的 RX 端口接收,反之亦然。因此,设备之间的连接是 TX1 连接到 RX2,TX2 连接到 RX1 以进行通信。下图说明了如何完成 UART 协议的连接。
uart双工通信连接
首次设置 UART 硬件时最常见的错误之一是将 TX1 与 TX2 连接,将 RX1 与 RX2 连接。这种错误很难发现,而且非常令人沮丧。因此,请务必确保将一个设备的 TX 与另一个设备的 RX 连接。这里要注意的另一件重要事情是,设备的 GND 也应连接。这一点很重要,因为电子设备读取或写入有关电压差的数据(5V 或 3.3 V高电平或 1 和 0V:低电平)。要测量电压差,我们需要一个参考电压。接地可提供参考,从而防止通信时数据损坏。

连接完成后,硬件设置就结束了。让我们继续了解 UART 数据包是什么以及它里面有什么:
uart数据帧

1.同步位

有 1 个起始位和 1 或 2 个停止位。它们表示数据包的开始和结束。传输开始时,该线被拉至 0 或低电平,表示帧的开始,传输完成时再次拉至 1 或高电平。当线为 1 或高电平时,它被视为空闲,表示没有正在进行的数据传输。只有 1 位表示“开始”,但停止位可配置为 1 或2。
uart中同步的起始位和停止位

2.数据位

数据帧的这一部分是问题的核心,因为它承载着要发送给接收器的信息。该块的长度可以从 5 位到 9 位不等,具体取决于设备之间商定的配置。标准数据大小为 8 位或 1 字节。根据 UART 标准,协议遵循小端顺序,即数据从 LSB(最低有效位)发送到 MSB(最高有效位),但也可以配置为遵循大端顺序,即从 MSB 到 LSB。
uart大端数据传输

3.奇偶校验位

UART 带有错误检查机制,用于检查接收数据块的完整性。由于数据在 UART 中是逐字节发送的,因此会对每个接收字节进行错误检查。它使用奇偶校验位来执行此操作;它是在数据位之后发送的错误检查代码。奇偶校验位有两种模式:奇数或偶数。

奇校验: 为了检查数据块的完整性,程序会检查数据中存在的 1 的数量,包括校验位。发送器执行以下步骤来生成数据帧的校验位。

  1. 计算数据位中 1 的数量
  2. 如果 1 的数量为奇数,则将奇偶校验位设置为 0,否则设置为 1。此过程使块中的 1 的总数(数据位 + 奇偶校验位)为奇数。
  3. 接收方检查收到的块(包括校验位)中 1 的数量是奇数还是偶数。如果 1 的数量为奇数,则数据有效。如果 1 的数量为偶数,则数据无效。

偶校验: 偶校验检查数据中的 1 是否为奇数,而不是奇数个 1,并在发送方和接收方采用相同的方法。如果块中的 1 为奇数,则奇偶校验位设置为 1;如果块中的 1 为偶数,则奇偶校验位设置为 0。最终目标是使数据传输中的 1 数量为偶数。接收方检查块中的 1 数量(数据位 + 奇偶校验位)是否为偶数,以验证数据传输。

这是一种简单的错误检查机制,如果传输过程中有多个位损坏,该机制就会失效。它也无法识别传输过程中哪个位损坏了。

太棒了!我们已经准备好发送数据了。但是 UART 如何在没有任何公共时钟的情况下同步数据传输?这是通过称为“波特率”的配置完成的。

4.波特率

它指定以 bps(比特/秒)为单位发送数据的速度。为了进行 UART 通信,设备设置为相同的波特率。一些标准波特率为 9600、38400、115200、921600 等。反转波特率,您将获得每个位传输所需的时间。例如,
波特率
因此,波特率为 9600 时,每个位传输时间为 104.16 微秒。对于硬件而言,设备会将线路拉高或拉低 104.16 微秒。

现在您几乎了解了实现协议所需的一切。这些知识对于在出现任何奇怪行为时调试程序至关重要。

标签:异步,UART,连接,奇偶校验,传输,接收,发送器,设备
From: https://blog.csdn.net/qq_37255138/article/details/142255555

相关文章

  • ajax异步调用
    在JavaScript中,由于`getCity`和`getstations`是异步调用的操作(可能是通过AJAX调用数据),你需要确保在这些操作完成后再调用`uodatastation`方法。可以使用回调函数或者`Promise`来确保顺序执行。假设`getCity`和`getstations`使用`$.ajax`时支持回调函数或返回......
  • 使用 `Roslyn` 分析器和修复器 对异步方法规范化返回Async结尾
    之前写过一篇使用修复器帮助添加头部注释文本的功能,今天使用Roslyn的代码修复器对异步返回方法规范化的功能实现分析器首先需要实现分析器,使用RegisterSyntaxNodeAction,分析所有SyntaxKind.MethodDeclaration的语法类型,[DiagnosticAnalyzer(LanguageNames.CSharp)]public......
  • 异步实例化预制体Object.InstantiateAsync配合Async/Await使用
    Unity2022.3.20之后,可以使用异步克隆,正如前面一篇文章《Unity2022.3.20f1新功能,异步实例化预制体Object.InstantiateAsync》说明的那样,常规的使用携程方式异步克隆,但如今await/async写法如此简单方便,肯定就不想放IEnumerator里头去实现了,怎么办呢?实现一个,代码如下:publicGame......
  • python 异步的几种方式
    importasyncioimportrandomimportthreadingfromconcurrent.futuresimportThreadPoolExecutorimporttimedefblocking_task(x):time.sleep(2)thread_name()print(f'arg:{x}\n')returnx*2asyncdefunblocking_task(x):t......
  • 【项目实践】CompletableFuture异步编排在多任务并行执行中的使用
    【项目实践】CompletableFuture异步编排在多任务并行执行中的使用一、单次请求处理多任务的场景        在实际项目中,我们经常会遇到一些比较复杂的查询,需要给前端响应一个内容量较大的响应结果。例如在租房系统的app中,点击具体的某个房间查看详情,需要后端将这个房间的......
  • 面试-JS基础-异步和单线程
    同步和异步的区别是什么?手写Promise加载一张图片前端用到异步的场景?JS是单线程语言,只能同时做一件事浏览器和nodejs已支持JS启动线程,比如WebWorker(不知道是啥东西)JS和DOM渲染共用一个线程,因为JS可以修改DOM结构。意味着JS在工作的时候DOM渲染要停止,反之亦然。异步的出......
  • 鸿蒙里面处理异步函数的方法
    1.使用then()方法是用于处理异步操作成功后的结果,并且可以链式调用以实现多个异步操作的顺序执行.then()处理初始Promise的结果,然后返回一个新的值,这个新值被传递给下一个.then(),以此类推错误处理:如果在.then()中的函数抛出错误,这个错误会被传递给下一个.then()的on......
  • Qt 中实现异步散列器80
    前言在前面两篇实战文章中:OpenTelemetry实战:从零实现分布式链路追踪OpenTelemetry实战:从零实现应用指标监控:西部世界官网覆盖了可观测中的指标追踪和metrics监控,下面理应开始第三部分:日志。但在开始日志之前还是要先将链路追踪和日志结合起来看看应用实际使用的实践。......
  • uniapp 将数据存储在本地缓存setStorage及从本地缓存中异步获取getStorage
    一、uni.setStorage(OBJECT)将数据存储在本地缓存中指定的key中,会覆盖掉原来该key对应的内容,这是一个异步接口。HarmonyOSNext兼容性HarmonyOSNextHBuilderX4.23OBJECT参数说明参数名类型必填说明keyString是本地缓存中的指定的keydat......
  • Qt 中实现异步散列器
    【写在前面】在很多工作中,我们需要计算数据或者文件的散列值,例如登录或下载文件。而在Qt中,负责这项工作的类为 QCryptographicHash。关于 QCryptographicHash:QCryptographicHash是Qt框架中提供的一个用于生成加密散列(哈希值)的类。该类可以将任意长度的输入(二进制或文......