前言
UART(Universal Asynchronous Receiver Transmitter)是最常用的设备对设备(串行)通信协议之一。它是 Arduino 板用来与计算机通信的协议。它允许异步串行通信,其中数据格式和传输速度是可配置的。它是最早的串行协议之一,尽管它在许多地方被 SPI 和 I2C 所取代,但它仍然广泛用于低速和低吞吐量应用,因为它非常简单,低成本且易于实现。
一、UART 的工作原理
UART 的工作原理是将数据传输为一系列比特位,包括起始位、数据位、可选奇偶校验位和停止位。与同时传输多个比特的并行通信不同,UART 以串行方式发送数据,每次发送一个比特。顾名思义,该协议是异步运行的,这意味着它不依赖于共享时钟信号。相反,它使用预定义的波特率来确定数据位的时序。
如上图所示,当使用并行通信时,8 位消息需要 8 根线,而串行通信只需要一根线用于发送消息和一根线用于接收消息。
UART 的关键部分包括发送器、接收器和波特率。发射器从源收集数据,将其转化为串行位,并通过 TX(传输)引脚发送。接收器通过 RX(接收)引脚接收它,处理传入的串行数据并将其转换为主机系统的并行数据。波特率决定了数据传输的速度。
时序和同步是 UART 通信的关键方面。与 SPI 和 I2C 等同步串行通信协议不同,UART 是异步操作的,这意味着它不依赖于共享时钟信号来协调数据传输。相反,它使用预定义的波特率来确定数据位的时序。
波特率是 UART 通信中的一个基本参数。它定义了数据在通信信道上传输的速度。波特率以比特每秒(bps)为单位,表示一秒钟内传输的比特数。在 UART 中,发送设备和接收设备必须采用相同的波特率,以确保通信成功。波特率的重要意义在于它直接影响数据的传输速度。更高的波特率允许更快的数据传输,但它也要求发送方和接收方之间更精确的时钟同步。另一方面,较低的波特率可能适用于时钟精度不太重要的应用程序,但它会导致较慢的数据传输。常见的波特率是 4800,9600,57600,115200。
UART 流量控制是一种慢速和快速设备通过 UART 相互通信而不会丢失数据的方法。考虑两个设备通过 UART 进行通信的情况。发送器 T 向接收器 R 发送一长串字节,接收器 R 比 T 慢,R 跟不上。在继续接收数据之前,它需要对数据进行一些处理或清空一些缓冲区。R 需要告诉 T 停止传输一段时间。这就是流量控制的用处。流量控制提供额外的信号来通知发送器它应该停止(暂停)或开始(恢复)传输。存在几种形式的流量控制。例如,硬件流控制使用额外的线,这些线上的逻辑级别定义了发送器是应该继续发送数据还是停止。通过软件流控制,在正常的数据线上发送特殊字符来实现开始或停止传输。
你可以在这里阅读有关 UART 流量控制的更多信息。
二、UART 协议
在 UART 通信中,每个数据帧由开始位和停止位封装。这些位在建立数据传输边界和确保发送方和接收方之间的同步方面起着至关重要的作用。
帧格式
起始位
在每个 UART 帧的开始处传输单个起始位。起始位的主要目的是指示数据传输的开始,并使接收器做好接收数据的准备。
对于 UART 通信,起始位总是逻辑低 (0)。这意味着起始位作为低于逻辑高阈值的电压电平传输,通常在接收器端。
当接收器检测到一个起始位时,它就知道一个新的数据帧开始了,并准备接收传入的位。
数据位
数据位是 UART 通信的基本组成部分,因为它们携带要传输的实际信息。UART 帧中的数据位数可以变化,但一个常见且广泛使用的配置是 8 位。但是,UART 支持各种字符大小,包括 7 位和 6 位配置,具体取决于具体的应用程序需求。
字符长度
UART 通信中的字符大小由帧内的数据位数定义。选择合适的字符大小来匹配传输数据的要求是非常重要的。以下是一些常见的字符大小配置:
8 位:这是 UART 通信中最常见的字符大小。它允许传输一个字节的数据,它可以表示广泛的值,包括 ASCII 字符、数值等。
7 位:在需要更小的数据大小的情况下,使用 7 位字符大小。它适用于需要较少数据开销并且可以表示 128 个不同值的应用程序。
6 位:对于更紧凑的数据表示,可以使用 6 位字符大小。这个配置提供了表示 64 个不同值的能力。
数据完整性
在 UART 通信中,数据传输的准确性依赖于数据位的合理配置。发送方和接收方必须就数据位的数量和编码达成一致。如果配置不正确,可能会导致数据损坏。例如,如果发送方发送的数据为 8 位字符,而接收方配置为 7 位 字符,则可能会导致数据误读,从而导致接收到的信息错误。
奇偶校验
除了数据位之外,UART 通信还可以包括一个奇偶校验位作为数据帧的一部分。奇偶校验是一种错误检查机制,可以帮助检测数据传输错误。奇偶校验可以设置为 “奇数” 或 “偶数”,它确保在一个字符中设置为逻辑 “1” 的总位数是偶数还是奇数,这取决于所选择的奇偶校验类型。奇偶校验位的存在允许接收方验证接收数据的完整性。如果 “1” 位的数量与期望的奇偶校验不匹配,则检测到错误。
停止位
在每个 UART 帧内的数据位之后发送一个或多个停止位。停止位表示数据字节的结束,并表示数据传输的结束。最常见的配置是使用一个停止位,但在需要增加可靠性的情况下,可以使用两个停止位。
停止位的极性可以变化,一些系统使用高停止位,另一些系统使用基于特定 UART 配置的低停止位。
三、UART 长距离传输方案
早期由于 PC 都带有 RS-232 接口,所以我们需要使用 UART 时,都选择 RS-232。但是现在个人电脑,不光是笔记本,包括台式机都不再带有 RS-232 的接口,大家看到电脑主板上面没有 DB9 的接口。所以现在开发板都选择 TTL 的 UART,或者直接 UART 转 USB 做在开发板上。
由于 TTL 信号无法远距离传输,所以在工业中经常使用 RS-232 和 RS-485 接口来进行长距离 UART 传输。
RS-232 和 RS-485 指的是数字数据传输的接口。RS-232 标准通常被称为普通计算机COM端口或串行端口。
RS-232 是美国电子工业协会 EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS 是英文 “推荐标准” 的缩写,232 为标识号。RS-232 是对电气特性以及物理特性的规定,只作用于数据的传输通路上,它并不内含对数据的处理方式。需要说明一下,很多人经常把 RS-232、RS-485 误称为通讯协议,这是很不应该的,其实它们仅是关于 UART 通讯的一个机械和电气接口标准。RS-485 接口在工业中广泛用于连接各种设备。该表显示了 RS-232 和 RS-485 接口之间的主要区别。
Port name | RS-232 | RS-485 |
---|---|---|
Transfer type | Full duplex | Half duplex (2 wires),full duplex (4 wires) |
Maximum distance | 15 meters at 9600 bps | 1200 meters at 9600 bps |
Contacts in use | TxD, RxD, RTS, CTS, DTR, DSR, DCD, GND* | DataA, DataB, GND |
Topology | Point-to-Point | Multi-point |
Max. Number of connected devices | 1 | 32 (with repeaters larger, usually up to 256) |
*对于 RS-232 接口,不需要使用所有的接触线。通常使用 TxD、RxD 和 GND,其余线路用于控制数据流。
RS-232
RS-232 接口(TIA/ EIA-232)用于在点对点方案中组织发射机或终端(数据终端设备,DTE)与接收器或通信设备(数据通信设备,DCE)之间的数据传输。
RS-232 的速度取决于设备之间的距离,通常在 15 米的距离下速度为 9600bps。在最小距离上,速度通常为 115200bps,但有些硬件支持高达 921600bps 的速度。
RS-232 接口工作在全双工模式下,允许你同时发送和接收信息,因为接收和发送使用不同的线路。这与半双工模式相反,当一条链路用于接收和传输数据时,它对同时操作施加了限制,因此在半双工模式下,一次仅可以接收或传输信息。
RS-232 接口上的信息通过逻辑 0 和 1 进行数字传输。逻辑 “1” 对应于 -3 到 -15v 范围内的电压。逻辑 “0” 对应的电压范围为 +3 到 +15v。
除了两条接收和发送线外,RS-232 上还提供用于硬件流量控制和其他功能的专用线。
连接 RS-232 时,使用特殊的 D-sub 连接器,通常为 9 针 DB9,较少使用 25 针 DB25。
RS-232 有三种设备连接方式:
DTE-DTE、DTE-DCE、DCE-DCE。DTE-DCE 电缆被称为直连线,因为触点是一对一连接的。DCE-DCE 电缆称为交叉线。
DB9 和 DB25 连接器的引脚如下表所示。
DB9 | DB25 | Designation | Name |
---|---|---|---|
1 | 8 | CD | Carrier Detect |
2 | 3 | RXD | Receive Data |
3 | 2 | TXD | Transmit Data |
4 | 20 | DTR | Data Terminal Ready |
5 | 7 | GND | System Ground |
6 | 6 | DSR | Data Set Ready |
7 | 4 | RTS | Request to Send |
8 | 5 | CTS | Clear to Send |
9 | 22 | RI | Ring Indicator |
要与 RS-232 设备一起工作,通常只需要 3 个触点:RXD, TXD 和 GND。但有些设备需要全部 9 个触点才能支持流量控制功能。
流量控制
为了不丢失数据,有一种控制数据流的机制,它允许暂时停止传输数据以防止缓冲区溢出。
有硬件和软件的控制方法。
硬件方法使用 RTS/CTS 控制。如果发送器准备好发送数据,那么它将在RTS拉高。如果接收器准备好接收数据,它将CTS线拉高。如果其中一个信号未拉高,则不会发生数据传输。
软件方法使用使用同一 TXD/RXD 通信线路传输的 Xon 和 Xoff 字符(ASCIl 字符 Xon = 17, Xoff = 19)作为主要控制方式,而不是通过引脚。如果接收不到数据,接收器发送 Xoff 符号。如果要恢复数据传输,发送 Xon 符号。
RS-485
在工业中,最常见的接口是 RS-485 (EIA-485),因为 RS-485 使用多点拓扑,允许连接多个接收器和发送器。RS-485 使用差分信号进行数据传输。
RS-485有两种类型
- RS-485,2个触点,半双工模式
- RS-485,4个触点,全双工模式
在一个 RS-485 网络中,最多可以有 32 个设备,但在额外中继器和信号放大器的帮助下,最多可以有 256 个设备。在同一时间,只能有一个发射机处于活动状态。
运行速度还取决于线路的长度,在 10 米的距离上可以达到 10mbit/s。
线路上的电压范围为 -7v ~ +12v。
RS-485 标准没有定义特定类型的连接器,但通常是 DB9 连接器。
RS-485 连接器的引脚取决于设备的制造商,并在文档中指定。
以下是常用的引脚连接方式:
RS-485 的多点拓扑结构:
为了在远距离匹配线路,RS-485 还在线路的开始和结束处配备了 120 欧姆的端接电阻。
参考资料
https://docs.arduino.cc/learn/communication/uart/
https://www.optcore.net/difference-between-rs-232-rs-422-and-rs-485/
https://www.allaboutcircuits.com/technical-articles/whats-the-difference-between-rs-232-and-rs-485/
https://ipc2u.com/articles/knowledge-base/the-main-differences-between-rs-232-rs-422-and-rs-485/