UART基础
一、串口通信的的技术背景
我们在嵌入式系统中,经常听到四个术语: UART、TTL、RS-232 和 RS-485 。
对于初学者来说,经常搞不清楚这四个术语到底有什么区别,有什么联系。
本文将围绕这四种接口,介绍它们的基本定义和用途、电气特性、通信协议细节,并通过图示解释通信原理,最后对各自的适用场景和技术特点进行对比分析。
UART 的全称是 Universal Asynchronous Receiver and Transmitter,翻译过来是通用异步收发器,是一种串行通信的协议和硬件模块,负责在设备内部实现串并转换并定义数据帧格式。
UART 于 20 世纪 60 年代由贝尔实验室发明,用于计算机与电传打字机之间的异步通信。
UART 的出现解决了将并行数据转换为串行数据的问题。
依赖于时钟信号做时序参考的通信技术,成为同步通信;
没有时钟信号的通信技术,称为异步通信。
UART 是一种异步通信技术。
因其简单实用,UART 协议被广泛应用于各种串行总线,我们日常接触的串口通信其实大多都是基于 UART 协议。
二、UART 和 TTL,RS-232,RS-484 的关系
UART 本身并不规定具体的电压电平和连接器标准,它专注于通信时序和数据格式。
UART 模块通常有两条数据线:发送(TX)和接收(RX),可以实现全双工异步通信。
需要注意的是,UART 输出的信号电平取决于所使用的物理接口。
例如,嵌入式微控制器的 UART 引脚通常直接提供 TTL 电平 的串行信号,而不是 RS-232 等标准所要求的电平。
因此 UART 通信若要在不同设备间进行,除了在协议上约定帧格式外,还需确保电气电平兼容或通过转换器进行电平匹配。
2.1 TTL 电平
TTL 原指晶体管-晶体管逻辑(Transistor-Transistor Logic)电路,是一种数字电路的工艺和电平标准。
我们在嵌入式领域谈到 TTL 接口时,通常指 TTL 电平的串行通信接口。它可以被视为 UART 在物理层的一种实现,仅定义用多少电压代表逻辑 0 和 1。
TTL 电平典型地用约 0V 表示逻辑“0”,用 +5V(经典 TTL)或 +3.3V(常见于单片机的 CMOS 工艺 I/O)表示逻辑“1”,属于单端信号正逻辑(高电平=1)。
不同器件可能使用不同电源电压(如 5V、3.3V、2.5V 等)的 TTL/CMOS 电平,但它们本质都是通过高低电压区分“0”和“1”。
TTL 串行接口没有标准化的连接器形式,一般直接通过引脚或排针连接。
TTL 的信号幅度低,抗干扰能力较弱,因此适合短距离通信。
通常 TTL 串行仅用于同一电路板上的芯片间连接,或者通过短导线连接近距离的模块(通常在几十厘米以内)。
超过一定距离后,TTL 信号易受噪声干扰导致误码,因此如果需要更远距离或更复杂的连接,就要考虑采用专门的接口标准(如 RS-232 或 RS-485)来进行电平转换。
TTL 接口的优点是简单、成本低且与微控制器的 GPIO 直接兼容,不需要专用驱动芯片。
在嵌入式开发板上常见的调试串口(如单片机 USART 引出的 TX/RX 针脚)往往就是 TTL 电平的 UART 信号输出。
如果我们要将开发板的 TTL 串口连接到电脑的 USB 接口,一般需要使用“USB 转 TTL”串口适配器将这种原始信号转换成 USB 协议进行传输;
如果要将开发板直接连接老式电脑串口的 RS-232 接口,那就需要通过电平转换芯片(如 MAX3232)将 TTL 转换为 RS-232 电平。
总结概括: TTL 串行接口代表了 UART 通信的底层电压标准,特点是 0-5V/3.3V 电平、单端传输、无需专用接口芯片但仅适用于短距离低噪声的环境。
2.2 RS-232 接口
RS-232 是一种早期制定的串行通信物理层标准,由美国电子工业协会(EIA)在 1970 年制定(原始标准发布于 1962 年)。它定义了串行通信中信号的用途、连接器引脚和电气电平等内容,是计算机等设备之间串口通信的传统接口标准。
历史上,RS-232 使用 25 针的 DB-25 接头作为标准连接器,后来 IBM PC 将其精简为 9 针的 DB-9(DE-9) 接口,这成为 PC 机串口的事实标准。
经典 RS-232 接口除了传输和接收数据线(TXD/RXD)外,还有多条控制信号线(如 RTS, CTS, DTR, DSR 等)用于握手控制。不过在很多应用中简化为只使用 3 线连接:发送数据、接收数据和信号地(TXD、RXD、GND)。
RS-232 最突出特点是其电气信号电平和逻辑定义与 TTL 完全不同。
RS-232 采用负逻辑单端信号:规定逻辑“1”电平为 -5V~-15V,逻辑“0”电平为 +5V~+15V。
也就是说,RS-232 空闲线处于负电压(表示逻辑 1,称为“Mark”),而 TTL 空闲线为高电压(逻辑 1)。
当开始传送起始位时,RS-232 信号会从负电平跳变到正电平(表示逻辑 0),这与 TTL 情况正好相反。
采用较高幅度的 ± 电压是为了提高抗干扰能力和传输距离——RS-232 信号在几十米范围内有较好的抗噪声性能,一般最大传输距离可达约 15 米。
由于 RS-232 电平与数字电路的 TTL 电平不兼容,直接相连会损坏芯片,因此在微控制器与 RS-232 设备之间必须使用电平转换器(如 MAX232)将 TTL 转换为 ±12V 电平。
RS-232 接口的通信速率相对有限。
在异步通信中,早期标准波特率如 110, 300, 2400, 9600, 19200 等 bps 级别,虽然现代芯片也可支持更高波特率(如 115200bps 乃至更高),但在长距离下高速传输效果不佳。
由于采用独立的发送线和接收线,RS-232 支持全双工通信,并且通信仅能在点对点的两个节点之间进行(不支持一条线上挂多个设备)。
RS-232 接口曾广泛应用于计算机串口、调制解调器、打印机等外设连接以及早期工业控制设备的通信接口。
尽管如今 USB 接口已取代了 PC 上的 RS-232 串口,但 RS-232 在一些工业设备配置端口、医疗仪器、测量设备和老旧系统中仍然常见。
对于嵌入式初学者来说,理解 RS-232 有助于理解传统串口通信和现代接口差异,同时在需要与旧式串口设备交互时能够正确进行电平转换和通信配置。
2.3 RS-485 接口
RS-485(TIA/EIA-485)是为工业通讯环境设计的一种串行通信物理层标准,定义于 1980 年代(1983 年正式公布标准)。
RS-485 主要为克服 RS-232 的距离短、节点少和抗干扰能力弱等缺点而提出,在电气特性上做了重大改进。
RS-485 采用差分信号传输方式:数据通过一对双绞线上的电压差来表示逻辑状态,而不是单端对地电压。
具体来说,RS-485 规定两根信号线电压差为 +2V~+6V 表示逻辑“1”,电压差为 -2V~-6V 表示逻辑“0”。
这种平衡式差分传输能有效抑制共模噪声干扰,因为干扰往往同时影响两根线而使差分电压保持不变。
另外,RS-485 接收器具有很高的灵敏度,能够检测低至 200 mV 的电压差,从而保证即使经过长距离传输信号仍可被可靠识别。
RS-485 的信号电平幅度比 RS-232 低得多,一般由 +5V 或 +3.3V 供电的收发芯片驱动,因此不易损坏接口芯片,并且差分信号电平与 TTL 逻辑电平是兼容的(经过收发器转换后输出 TTL 电平),方便与 UART 接口连接。
RS-485 标准规定最大传输速率为 10 Mbps(在短距离时可达此速率)。
在距离与速率的权衡下,RS-485 在实际应用中常用于数百米到千米范围的通信:标准情况下最大可达 4000 英尺(约 1200 米)的距离(理论极限约 3000 米,在理想条件下)。
随着距离增加,需要降低波特率以保证可靠通信。
与 RS-232 只能点对点通信不同,RS-485 采用总线拓扑,支持多点通信。
一条 RS-485 两线制总线上最多可连接 32 个标准负载的收发器(有的器件改进可支持 128 节点甚至更多)。这使得 RS-485 非常适合多节点分布式系统,例如工业现场总线、楼宇自动化的多台设备联网等。
需要注意的是,标准的 RS-485 是半双工通信:同一时间总线上只能有一个节点发送数据,其余节点接收,需要通过协议来协调各节点的发送时序。
一般情况下,大多数 RS-485 网络都是半双工两线制,如下图所示。
上图展示了一个典型的两线制 RS-485 总线连接示意图。主机(Host)通过一对差分信号线 (标记为 SDA 和 SDB) 与多个从机 (Slave) 相连,所有节点的信号地 (SG) 相互连接以共享参考地。
在总线两端通常需要接入匹配电阻 (图中标记为 R) 以消除信号反射。
RS-485 总线上各节点平时都监听总线电压差,当某一节点获得总线使用权发送数据时,其他节点上的收发器将其差分信号转换回单端信号供 UART 处理,实现多机通信。
在这种总线拓扑中,只需一对双绞线即可将多个设备连成网络,既延长了通信距离,又提高了抗噪性能,非常适合工业现场等噪声大的环境。
RS-485 接口广泛应用于工业控制和数据采集领域,例如 PLC 和传感器的联网通信、楼宇安防和门禁系统、多机仪表网络以及需要长距离布线的场合。
对于嵌入式开发者来说,理解 RS-485 有助于构建可靠的长距离、多节点通信系统。
但同时也要注意 RS-485 仅规定物理层,实现多节点通信还需要在 UART 协议之上制定地址、仲裁等链路层协议(常见如 Modbus、Profibus 等),以避免总线冲突和管理通信秩序。
2.4 UART 协议详解
UART 所遵循的是一种异步串行通信协议。
所谓异步,是指通信双方没有共享时钟信号,而是依赖约定的波特率进行数据采样同步。
2.4.1 UART 的帧格式
UART 通信中数据以帧为单位发送,每帧包含起始位、数据位、校验位(可选)和停止位等部分。通信双方在通信前必须协商好波特率以及帧格式(数据位长度、是否校验、停止位个数等),这样接收方才能正确还原发送方发送的比特流。
一个典型的 UART 帧结构如下:1 位起始位 + 5~8 位数据位 + (可选 1 位校验位) + 1~2 位停止位。
其中,起始位用于标记一帧的开始,表现为线上的电平从空闲状态跳变至起始状态;
数据位紧随其后,通常是每帧 7 或 8 位数据(也可配置 5、6 位等非标准长度);
如果启用奇偶校验,则在数据位后会有 1 位校验位;
最后是用于帧结尾的停止位,可以是 1 位或 1.5 位或 2 位时间的高电平。
2.4.2 UART 数据发送和接收的步骤
UART 帧格式可由发送方和接收方根据需要配置,但发送和接收的双方配置必须一致才能正常通信。
发送和接收双方的配置,是需要事先人工协商好,两边同时都预设在软件里面的。
UART 协议发送和接收数据遵循如下的步骤:
(1)在空闲时,UART 线保持高电平(对于 TTL/CMOS 电平而言,此高电平代表逻辑“1”);
(2)传输一帧数据开始时,发送端会将线路电平从高拉低,产生一个起始位(逻辑“0”);
(3)接收端检测到电平从高变低的跳变时,即知晓有新帧开始,并以约定的波特率定时采样后续的数据位;
(4)接着发送的是若干位数据位,通常按照最低有效位(LSB)先发送的顺序输出预定数量的比特;
(5)数据位之后,若约定有校验,则发送方根据之前数据位的值计算出校验位(奇校验或偶校验)并发送。
(6)最后,发送一个或多个停止位,其为逻辑“1”(高电平)且持续至少一个数据位的时间,用以标识帧结束并使接收方的 UART 接收器恢复到空闲检测状态。停止位也使两帧之间可以留有间隔,以便接收器有时间处理数据。
2.4.3 TTL 电平的 UART 通信过程
上图显示了 TTL 电平下 UART 一帧数据的波形及帧结构示意(发送字节 0xAA 的场景)。
可以看到,线路空闲时保持高电平(TTL 逻辑 1)。当数据传输开始时,出现一个低电平的起始位,随后依次传送 8 位数据位 0 1 0 1 0 1 0 1
(0xAA 的二进制为 10101010,LSB 先出,因此线上的顺序是 0,1,0,1,... 直到 MSB),然后返回高电平作为停止位。在图中,各位的时序被清晰地标注:可以看出起始位保持一个位时间的低电平,接着每个数据位持续一个位时间,高低电平组合代表相应的比特,最后停止位恢复为高电平。
同一帧内发送端和接收端都遵循固定的波特率 $T$(位宽为 $1/T$ 秒),因此接收方只需在起始位检测到后,每隔一个位宽采样一次信号,就能将数据位读出。
2.4.4 RS-232 电平的 UART 通信过程
上述 UART 帧如果通过 RS-232 电平 来传输,其波形如下图所示。
可以看到,在 RS-232 标准下,线路空闲时为负电压(逻辑“1”),当发送起始位时,电压跳变到正电压(表示逻辑“0”),接着输出数据位序列的正负电压变化对应 0/1 比特。
例如,同样发送 0xAA,RS-232 线上的电压在起始位时从约 -12V 跳到 +12V,然后交替变化表示 10101010 序列的各位,最后停止位回到 -12V。可以发现,RS-232 与 TTL 在逻辑电平上是相反的:TTL 是高电平表示 1,低电平表示 0;RS-232 则是负电平表示 1,正电平表示 0。
但对于 UART 控制器而言,这种电平差异由外部收发器转换完成,UART 接收到的仍是正确的比特序列。
因此,无论底层使用 TTL 还是 RS-232,只要帧格式和波特率一致,UART 通信机制本身是不变的。
2.4.5 波特率 Baud Rate
波特率是 UART 通信中的一个重要参数,指每秒传输的符号(位)数量。
例如常用的波特率 115200 表示每秒传送 115200 比特的数据。
发送和接收设备必须使用相同波特率,否则接收端将以错误的时间间隔取样,导致数据位解析错误。
初学者在调试串口通信时,经常遇到的问题便是波特率设置不一致,从而出现乱码或无法通信的现象。常见标准波特率有 110、300、1200、2400、4800、9600、19200、38400、57600、115200 等,当需要更高速通信时,一些 UART 也支持非标准波特率(如 1 Mbps 以上),但距离越远或线缆质量越差,高速下误码的风险越高。
2.4.5 总结
UART 协议层确保了异步串行通信的数据格式和同步方法,而 TTL、RS-232、RS-485 则是物理层实现,决定信号如何在介质上传输。
通信双方只要采用相同的帧格式和波特率,就能够通过一对信号线在无时钟同步的情况下实现可靠的数据交换。
不同物理层的差异只影响电信号的传输特性,而 UART 模块负责在接收端将这些信号转换回数字数据供 CPU 使用。
三、TTL,RS-232,RS-485 适用的场景分析
综合以上特性,我们可以分析这几种接口在不同场景下的适用性。
3.1 UART_TTL 接口的适用场景
适用于板内或短距离点对点通信。当两个芯片或模块距离很近(几厘米到几十厘米范围)时,可以直接使用UART的TTL信号互联,省去额外芯片。在调试阶段,常用USB转TTL线将开发板的UART引脚连接到电脑USB,实现调试信息输出。TTL接口的优点是简单直接、延时低,但缺点是传输距离极短且抗干扰能力差。因此TTL一般只用于设备内部或临近模块间的通信,例如单片机与GPS模块、蓝牙模块等的连接。如果需要连到远一点的设备,必须加电平转换器提升为RS-232或差分驱动为RS-485。
3.2 UART_RS-232 接口的适用场景
RS-232 接口适用于短距离设备间通信,典型场景是点对点连接如计算机串口与外部设备(PLC、传感器、仪器等)通信,或者工业设备的人机接口端口。RS-232 的优势在于历史悠久,很多老设备都支持,且实现简单(一发一收两条线即可全双工)。它抗扰能力比 TTL 强**,在办公环境等低噪声场合的几米电缆上可靠传输。其主要限制是距离和速率:一般不建议超过 15 米距离,波特率高于 115200bps 后稳定性会下降。另外 RS-232 只能连接两个节点,不支持多机联网。如果要从微控制器输出 RS-232,一般需要增加 MAX232 芯片等进行电平转换,这增加了硬件开销。总的来说,RS-232 仍常见于需要与 PC 或带串口的单台设备通信的场景,如调试串口(早期 PC 机没有 USB 时)、医疗设备配置接口等,但在新设计中逐渐被 USB 和网络接口取代。
3.3 UART_RS-485 接口的适用场景
RS-485 接口 适用于长距离、噪声环境、多节点的通信网络。由于 RS-485 采用差分总线,通信距离可长达数百米以上,并支持多点总线拓扑,非常适合工业控制、楼宇自动化等需要将众多设备联网的场合。例如工厂车间里多个 PLC 和传感器通过 RS-485 组成总线网络,实现集中监控;楼宇的空调、消防等设备也常通过 RS-485 互联组成控制网络。RS-485 在抗干扰方面最为突出,在强电磁干扰环境下仍能可靠工作。同时其通信速率在短距离时可达到数 Mbps,满足大多数控制系统需求。但 RS-485 需要每个节点配置专用的收发器芯片,硬件稍复杂;并且属于半双工共享总线,需要设计通信协议避免数据冲突。例如典型的 Modbus 协议就在 UART 帧基础上增加了地址和校验机制,以实现 RS-485 总线上的主从通讯。同样条件下,RS-485 的成本要高于 RS-232(因为需要多节点收发器和布线),
因此仅在确有多机通信或长距离需求时才选用。对于点对点且距离不长的情况,RS-232 或直接 TTL 可能更简单。
3.4 总结
需要强调的是,这几种接口并非孤立存在,而是可以组合使用的。UART 是基础,TTL、RS-232、RS-485 只是 UART 信号在不同物理层的体现。
一个嵌入式系统往往 UART 模块输出 TTL 电平,通过选择不同的接口芯片,就可以转换成 RS-232 用于点对点、或 RS-485 用于总线网络。
例如,很多设备提供可选的通信模块:要连接 PC 就插入 RS-232 模块,要多机通讯就换成 RS-485 模块,但它们底层都是使用 UART 发送的数据。
初学者应根据实际需求选择合适的接口:室内短线直连选 TTL 或 RS-232 即可,室外或工业长线通信则考虑 RS-485。
同时注意接口转换的必要性,避免直接将不兼容的接口相连(如 TTL 直接连 RS-232 设备是错误的,需要电平转换)。
下面的表格总结了 UART(TTL)、RS-232 和 RS-485 接口的主要技术特点和优缺点,便于直观对比:
接口 | 性质/定义 | 电平逻辑 | 传输介质 | 通信距离 | 典型波特率 | 通信拓扑 | 优点 | 缺点 |
UART (TTL) | 协议标准,TTL电平(处理器直接串口) | 逻辑1 ≈ 高电平 (5V/3.3V)逻辑0 ≈ 低电平 (0V) | 单端,两线(TXD/RXD+地) | 几厘米~几十厘米(板内连接) | 低速~中速常用110bps~数Mbps | 点对点,全双工 | 硬件简单、无需专用驱动芯片与CPU IO直接兼容 | 电平不统一,不同设备直连需匹配抗干扰能力弱,距离极短 |
RS-232 | 串行通信物理层标准 | 逻辑1 = -3V~-15V逻辑0 = +3V~+15V | 单端,两线(TXD/RXD+地) | ~15米(标准建议最大) | 低速典型110bps~115200bps | 点对点,全双工 | 无需复杂协议,即插即用抗扰能力较TTL好,接口通用 | 仅能连两个设备,无法扩展需电平转换芯片,电压高耗能较大 |
RS-485 | 串行通信物理层标准 | 逻辑通过A-B电压差表示ΔV ≥ +0.2V 为“1”; ≤ -0.2V 为“0” | 差分,双绞线(一对A/B+地) | 理论最大1200米常用数百米 | 低速~高速300bps~10Mbps | 总线式,多点(半双工) | 差分信号抗干扰强支持多节点网络,距离远 | 需总线仲裁协议避免冲突硬件复杂度高,需终端匹配电阻等 |
表:UART(TTL)、RS-232、RS-485 技术特点对比
上表中可以看出,UART(TTL)本身只是定义了通信协议和使用 TTL 电平,简单易用但在物理连接上没有规范,因此电平和接口形式不统一;
RS-232 通过定义标准连接器和高低电压实现了在点对点短距离通信中的可靠性,但只能一对一连接且速度较低;
RS-485 采用差分总线极大增强了抗干扰能力和通信距离,支持多机通讯,但需要更复杂的通信控制。理解这些差异有助于我们在不同应用场景下选择合适的串行通信接口,并采取相应的硬件措施来保证通信稳定。
对于嵌入式初学者,掌握 UART、TTL、RS-232、RS-485 四种接口的原理和区别,是构建可靠串行通信的基础。
一句话总结来说:
UART 提供了通用的异步串行通信框架,
TTL 电平适用于设备内部短距离直连,
RS-232 则规范了传统串口的连接方式而适合一对一短程通信,
RS-485 则是在复杂环境和长距离、多节点通信中的利器。
在实际工程中,这几种接口常配合使用,通过电平转换和协议设计共同实现从芯片内部到系统外部,从点对点到网络总线的通信需求。
参考文献:
- CSDN 博客:《UART RS232 RS485 协议原理及应用》blog.csdn.netblog.csdn.net
- CSDN 博客:《最详细的 UART 协议分析在这里!》blog.csdn.netblog.csdn.net
- Seeed Studio:《RS232 vs TTL: Beginner Guide to Serial Communication》seeedstudio.comseeedstudio.com
- Renkeer 博客:《RS485 Wiring, Communication and Difference with RS232》renkeer.comrenkeer.com
- FanZheng's Blog:《UART、TTL、RS232 等概念的区别与联系》fanzheng.orgfanzheng.org
- cnblogs 论坛:《UART 波形分析》cnblogs.com
四、UART 和 GPIO 的关系
4.1 UART 是 GPIO 的一个应用
UART 是一种通信协议,GPIO 是通用输入输出引脚。 UART 通常是映射在 GPIO 引脚上使用的专用功能,即:GPIO 可以配置为 UART 使用。
项目 | UART | GPIO |
全称 | Universal Asynchronous Receiver/Transmitter | General Purpose Input/Output |
本质 | 一个串行通信模块(协议 + 硬件) | 一个通用的可编程引脚 |
功能 | 实现串行数据通信(TX/RX) | 可以读取电平(输入)或输出高低电平(输出) |
是否专用 | 是专用外设模块 | 是通用资源 |
是否具有协议 | 有:起始位、数据位、停止位、波特率等 | 无:仅为高/低电平控制 |
是否可映射复用 | 通常通过 GPIO 的复用功能来暴露出来 | 可配置为多种功能:GPIO / UART / I2C 等 |
4.2 GPIO 作为推挽输出还是开漏输出
4.2.1 TTL 和 RS-232 作为物理层标准
UART 的 TX 引脚,会自动被配置为推挽输出;
UART 的 RX 引脚,通常配置为浮空输入(或带下拉)。
情况 | 使用方式 | TX(发送) | RX(接收) |
硬件 UART(最常见) | 通过 UART 模块复用 GPIO 功能 | 自动变为 推挽输出(无需配置) | 自动变为 浮空输入 |
模拟 UART(bit-bang,软件模拟) | 使用 GPIO 模拟串口协议 | 应配置为 推挽输出 | 应配置为 浮空输入 或带弱下拉 |
4.2.2 为什么 TX 要用 推挽输出?
UART 的 TX 引脚需要在通信时快速切换高电平/低电平,精确输出“1”或“0”。
推挽输出模式允许输出高电平时连接 Vcc,输出低电平时连接 GND,电平转换速度快、驱动能力强,适合高速通信。
而开漏输出只能下拉至低电平,要靠外部上拉电阻输出高电平,不适合 UART 的高速切换。
4.2.3 为什么 RX 用浮空输入或带下拉?
(1)UART 的 RX 是接收对方的信号,它只负责读取引脚电平,不需要主动驱动。
(2)浮空输入可以直接接受外部电平。
(3)若担心通信线空闲状态容易浮动,可以设置为 带弱下拉(这样线路空闲默认是低电平,但这得配合通信协议特性使用)。
4.3 RS-485 作为物理层标准
在 RS-485 通信中,为了避免多个设备同时驱动总线而烧毁,TX 引必须使用开漏输出 + 上拉电阻 + 软件控制方向,这是在多主机冲突规避策略中的一种用法。
这和 onewire, I2C 技术一样,采用了开漏输出,才能利用线与逻辑,达到多个设备共用一个总线的目的。
4.4 总结
引脚 | 功能 | 模式(推荐) | 说明 |
TTL和RS-32 的TX | 串口发送 | 推挽输出 | 提供强驱动能力,快速翻转 |
TTL和RS-32 的RX | 串口接收 | 浮空输入 / 弱下拉 | 接收数据,不驱动 |
RS-485 的差分线 | 发送和接收 | 开漏输出 | 半双工通信 |
五、再次解释 UART 和 RS-485 之间的关系
由于 RS485 在工业领域用途实在是太广,我们再花费一章再次解释 UART 和 RS-485 的关系。
5.1 从网络分层角度理解 UART 和 RS-485
UART 是一种串行通信协议,是描述的逻辑层,也可以说是数据链路层的内容; RS-485,RS-232,TTL,描述是物理电气标准,是物理层的内容。 UART ≠ RS-485,
UART ≠ TTL,
UART ≠ RS-232。
我们把串行通信分成两个层级来看:
层级 | 名称 | 功能 | 举例 |
协议层(逻辑层) | UART | 定义通信帧格式(起始位、数据位、校验位、停止位)和波特率 | UART 协议、Modbus RTU |
物理层(电气层) | RS-485 | 定义信号传输方式、电平、布线、抗干扰特性 | TTL(0~3.3V)、RS-232(±12V)、RS-485(差分) |
把 UART 协议通过不同的物理层传出去,可以有三种方式:
(1)UART + TTL: 适合板内通信,点对点的方式;
(2)UART + RS-232:适合短距离 PC 和设备之间的通信;
(3)UART + RS-485:适合长距离,多个设备组网的方式通信。
5.2 为什么 RS-485 需要 UART?
RS-485 本身不定义通信协议,它只是规定了电气特性,也就是物理层的内容:
(1)如何通过两根差分线(A/B)传输信号
(2)差分电压 ≥ +0.2V 为逻辑 1,≤ -0.2V 为逻辑 0
(3)多个设备共享一条总线,通信距离远、抗干扰强
但 RS-485 并不规定:
(1)起始位、数据位、停止位怎么处理
(2)每秒传几比特(波特率)
(3)怎么识别一帧数据
所以——要让 RS-485 “会说话”,就需要 UART 来组织这些 0/1, 构成通信帧,让收发双方都能识别。
通常的组合方式如下:
单片机 UART --- RS-485 收发芯片(如 MAX485) --- 双绞线 --- 另一个 RS-485 收发芯片 --- 另一台设备的 UART
RS-485 是负责把 UART 输出的信号变成 差分信号 进行远距离传输,再由对方芯片转换回 UART,在给到主芯片去做数据识别。
但是,RS-485 只是把 UART 作为主要的通信帧格式,但是 UART 并不是 RS-485 的唯一通信协议。
5.3 实际应用:RS-485 用 UART 做什么?
RS-485 多用于主从通信 / 工业控制 / 楼宇自动化场景,常用的上层协议是:
协议 | 是否基于 UART | 简介 |
Modbus RTU | ✅ 是 | 工业控制常用协议,用 UART 帧 + 地址帧管理多设备 |
自定义协议 | ✅ 是 | 许多厂商自定义帧结构,基于 UART |
Profibus | ❌ 否 | 更复杂的应用,西门子联合其他公司1987年提出的总线协议,另有独立物理层和协议,不走 UART |
5.4 总结
你可以这样理解:UART 是一门语言(说话方式),RS-485 是一个麦克风和电话线(传声的工具)。
你可以用这门语言说话(UART),但能不能远距离送出去、送多远、多人听不听得见,靠的就是传输介质(RS-485)。
六、RS-485 生态有哪些协议
这是 RS-485 协议生态图谱,展示了常见运行在 RS-485 物理层之上的协议:
- 中心节点:RS-485 是物理层标准(差分传输)
- 运行在其上的协议有: (1)Modbus RTU:工业领域最广泛应用的主从通信协议 (2)Profibus-DP:西门子主推的工业现场总线 (3)BACnet MSTP:楼宇自动化常用协议 (4)DNP3:电力与公用事业常见协议(可跑在 RS-485 或 TCP 上) (5)Custom UART Protocols:很多厂商也会基于 UART+RS-485 自定义协议栈
RS485 承载常用的协议参见如下表格:
协议 | 是否基于 RS-485? | 通信结构 | 是否基于 UART |
Modbus RTU | ✅ 是 | 主从结构 | ✅ 是 |
Profibus-DP | ✅ 是 | 主从结构 | ❌ 自己的帧格式 |
DNP3(部分实现) | ✅ 可选 | 主从/多主 | ✅/❌ 混合 |
BACnet MSTP | ✅ 是 | 多点控制 | ✅ 是 |