01、UART 协议
一、协议基础
1.1. 协议简介
UART(通用异步收发器)是一种数据传输技术,最早在上世纪60年代由贝尔实验室为连接计算机和电传打字机而开发。它的核心功能是把计算机内部的并行数据转换成串行信号发送出去,就像把一排人同时走楼梯改为单人依次过桥一样。
要理解UART的作用,可以分三层来看:
- 物理层:规定硬件连接的"物理规则",比如电线用什么电压表示0或1,电流大小等基础参数;
- 协议层:制定数据传输的"交通规则",比如每个数据包必须先发起始信号,再发数据内容,最后发结束信号;
- 应用层:定义数据的"实际意义",比如收到的数字是温度值还是控制指令。
我们日常用到的串口(COM口)、RS232/RS485等通信接口,都内置了这种UART协议。就像快递需要包装盒(物理层)+邮寄规则(协议层)+包裹里的东西(应用层)一样,UART让设备能稳定可靠地互相"说话",而且实现方式简单成本低,所以沿用至今。
图 1‑1 通讯协议的分层实现
UART通信最基础的用法很简单:物理连接只需要两根线,一根发数据(TX),一根收数据(RX),这样就能同时双向传输(全双工)。如果只需要单向传数据,一根线就够了。
比如两个单片机通信时,把它们的发送端和接收端直接连起来,就能用标准的TTL电平信号互相发消息。这种基础方案适合短距离通信。
当需要更远传输距离或更高可靠性时,可以换用不同的物理连接方式。比如RS232适合短距离但有信号隔离,RS485能支持长距离传输,这些都是在UART协议基础上,通过改变物理层实现的常见通信方式。
1.2. 不同的物理层实现
以下是更直白的改写版本:
串口常用的接口电平类型主要有四种:
- TTL(常见于开发板调试)
直接和芯片内部电路对接,比如开发板上的调试接口。但不同芯片可能用不同的电压(比如3.3V或5V),直接连其他设备可能损坏硬件,需要检查电压是否匹配。 - RS232(普通串口设备)
电压范围是±12V或±5V,能传更远距离(几十米),抗干扰比TTL强。但要用转换芯片把芯片的高低电平(0/1)转成RS232的高压信号,反过来也一样。 - RS485(工业设备常用,比如电表)
用两根线传输差分信号(类似左右对比),抗干扰特别强,能传上百米甚至更远。还能在同一总线上连几十到上百个设备(比如同时读多个电表数据)。但必须用转换芯片把普通电平转成差分信号。 - RS422
和RS485类似但用四根线(两发两收),适合超长距离或超高速传输,用得较少。
::: 简单总结:
TTL:开发板内部用,简单但只能短距离连相同电压的设备。
RS232:普通设备远距离通信,需要转换芯片。
RS485:工业场景必备,远距离+抗干扰+支持多设备,必须用转换芯片。
转换芯片的作用:就像翻译官,把芯片能懂的0/1信号转成适合远距离传输的信号(比如高压或差分信号),反过来也能把外界信号转回给芯片。 :::
1.3、基于RS232的UART通讯
RS232是什么?
RS232是1970年制定的串口通信标准,统一了串口连接器和电平标准。最常见的接口是DB9(9针接口),每个引脚有特定功能:
- Pin1(DCD):检测对方设备是否在线。
- Pin2(RXD):接收数据(接收对方发送的信息)。
- Pin3(TXD):发送数据(向对方发送信息)。
- Pin4(DTR):表示本设备已准备好通信。
- Pin5(GND):地线(提供参考电压)。
- Pin6(DSR):对方设备确认准备好通信。
- Pin7(RTS):本设备请求发送数据。
- Pin8(CTS):对方设备允许本设备发送数据。
- Pin9(RI):提示有来电或信号。
RS232的电压规则:
发送端:
- 逻辑0:输出+5V到+15V(正电压)。
- 逻辑1:输出-5V到-15V(负电压)。
接收端:
- 电压高于+3V视为0,低于-3V视为1,中间范围(-3V到+3V)无效。
::: 特点:
适合短距离通信(几十米内)。
信号容易受干扰,但适合设备间的简单连接(如老式调制解调器)。
需要正负电压,硬件实现比其他协议复杂。 :::
1.4、基于RS485的UART通讯
RS485是什么?
RS485是为长距离、抗干扰通信设计的标准,常用于工业环境。主要优势:
- 远距离传输:最长可达1200米,适合厂房或户外设备联网。
- 抗干扰强:通过两条线(A和B)的电压差传递信号,像“差分线”一样屏蔽外界干扰。
- 多设备共用:一条线上可连接最多32个设备,节省布线成本。
- 工业适用性:广泛用于工厂自动化、电力系统、智能家居等场景。
RS485的电压规则:
差分信号:
- 逻辑1:A线比B线高2-6V(如A=5V,B=0V)。
- 逻辑0:B线比A线高2-6V(如B=5V,A=0V)。
电压更低(接近TTL电平),更容易与电脑等设备连接。
:::
总结
RS232:适合短距离、简单设备间的通信(如老式电脑与调制解调器)。
RS485:适合长距离、多设备联网的工业环境,抗干扰能力强。
两者都是通过串口传输数据,但硬件实现和适用场景不同。选择时主要看距离、设备数量和环境干扰情况。 :::
二、协议规范
2.1. UART帧结构
在上一节的介绍中,我们通过璞石示波器观察了实际的UART波形,那么这个波形到底是怎么被准确的识别成字符‘D‘,而不是其它内容的呢?这就涉及到UART协议帧结构的定义。如图 2‑1所示:
图 2‑1 UART协议帧结构
当两个设备需要通过UART协议进行通讯时,它们需要同时约定好以下内容:
- 每一位信号的时间长度T(波特率 = 1/T)
- 帧结构中每一项的具体位数
- 是否有校验位,以及校验位的机制(奇/偶/..)
有了这些约定,接收设备只需要等待起始位的到来,再对之后的波形进行固定间隔的采样即可获得传输的具体信息。以字符‘D‘的波形为例,其解析过程如图 2‑2所示:
2.1.1. 波特率
波特率是UART协议,或者说所有异步串行协议,非常重要的一个概念,即单位时间内(1秒)可表示的bit位个数,或者也可以表述为bit位宽的倒数。例如一个波特率为115200的UART波形表示1秒可容纳115200个bit位,也就是说每一位bit数据占大约8.68uS的时长。
UART等异步串行协议,为了简化信号物理连接,降低通讯成本,一般只有一根信号线,无法同时传输数据和时钟信号。收/发设备为了正确解析波形就需要在相同的波特率设置下。而相同的波形使用不同的波特率获取的信息可能会完全不同。对于接收设备来讲,只有起始位可以作为一帧数据的同步点,其它数据都是通过波特率来确定具体的取样位置。
还是以字符‘D’的波形为例,如图 2‑4所示,如果用错误的波特率接收,就可能会得到完全错误的数据信息。
2.1.2. 空闲位
设备之间不传输数据时以持续的高电平表示空闲。空闲位持续时间越长,两个数据帧间隔也越长,单位时间传输的数据就越少。
2.1.3. 起始位
UART接收端会一直检测信号线上的电平变化,开始传输数据时,发送端将信号线从高电平拉到低电平结束空闲状态,并保持一个bit位的时长。接收器检测到高低电平转换时,开始接收信号。
2.1.4. 数据位
数据位包含传输的实际数据,如果使用了奇偶校验,那么数据位长为5~8 bits,如果没有使用奇偶校验,则位长为5~9 bits。在一般情况下,数据位为 8 bits,数据首先从最低有效位开始发送,高位在后。
2.1.5. 校验位
校验位可以用来提高传输的可靠性。如果信号在传输过程中因为干扰而导致某些位置的电平产生错误,通过计算接收的数据和校验位是否匹配即可判断数据是否有传输错误,从而给应用层提供有效信息来决定接受/丢弃对应的数据。
2.1.6. 停止位
停止位表示一帧数据的结束,实际信号是一段时间的高电平。停止位的时间长短可以设置为1、1.5或者2bits的停止位。大部分情况使用1bit的停止位。
因为UART是一个异步协议,每一帧的开头可以用跳变沿来同步,但是停止位只能通过波特率来计算相对位置,如果在停止位的位置识别到一个低电平,则会产生帧错误。在通讯过程中,为了减少波特率的误差导致的问题,可以设置不同的停止位长度来适配。