UART 使用指南
通用异步收发传输器 (Universal Asynchronous Receiver/Transmitter),通常称作 UART,是一种通用串行数据总线。
串行通信是指利用一条传输线将数据一位位地顺序传送,通信线路非常简单。
UART 为双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART 用于主机与辅助设备通信,如汽车音响与外接 AP 之间的通信,也用于 PC 机通信包括与监控调试器和其它器件,如 EEPROM 通信。
在 UART 上追加同步方式的序列信号变换电路的产品,被称为 USART (Universal Synchronous Asynchronous Receiver Transmitter)。
术语  | 定义  | 注释说明  | 
|---|---|---|
UART  | Universal Asynchronous Receiver/Transmitter  | 通用异步收发传输器  | 
TTL  | Transistor-Transistor Logic  | 逻辑门电路  | 
DCD  | Data Carrier Detect  | 载波侦听  | 
DTR  | Data Terminal Ready  | 数据终端准备好  | 
DSR  | Data Set Ready  | 数据准备好  | 
RTS  | Request To Send  | 请求发送  | 
CTS  | Clear To Send  | 清除发送  | 
RI  | Ring Indicator  | 响铃指示  | 
THR  | Transmit Holding Register  | 发送保持寄存器  | 
RBR  | Receive Buffer Register  | 接收缓冲寄存器  | 
ACPI  | Advanced Configuration and Power Interface  | 高阶配置和电源接口  | 
模块特性
- 
                    
兼容工业标准 16550 UART
 - 
                    
256x8bit 发送与接收 FIFO
 - 
                    
传输速度可达 3 Mbps
 - 
                    
支持 5-8 数据位以及 1/1 ½/2 停止位
 - 
                    
支持奇校验,偶校验或者无奇偶校验
 - 
                    
支持 DMA 控制器接口
 - 
                    
支持软件/硬件流控
 - 
                    
支持 IrDA 1.0 SIR
 - 
                    
支持 RS-485/9bit 模式
 - 
                    
RS-485 支持硬件使能
 - 
                    
Compact-IO 精简 2 线模式
 
通信协议
UART 作为异步串行通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。其协议中添加了一些特殊的表示位:
- 
                    
- 起始位 Start bit
 - 
                                
先发出一个逻辑“0”的信号,表示传输字符的开始。
 
 - 
                    
- 数据位 Data bits
 - 
                                
紧接着起始位之后。数据位的个数可以是 4、5、6、7、8 等,构成一个字符。通常采用 ASCII 码。从最低位开始传送,靠时钟定位。
 
 - 
                    
- 奇偶校验位 Parity
 - 
                                
数据位加上这一位后,使得“1”的位数应为偶数 (偶校验)或奇数 (奇校验),以此来校验数据传送的正确性。
 
 - 
                    
- 停止位 Stop bits
 - 
                                
它是一个字符数据的结束标志。可以是 1 位、1.5 位、2 位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。停止位的位数越多,时钟同步的容忍程度越大,但是数据传输率会越慢。
 
 - 
                    
- 流控 Flow contorl
 - 
                                
管理两个节点之间数据传输速率的过程,以防止出现接收端的数据缓冲区已满,而发送端依然继续发送数据,所导致数据丢失,我们会在一些上位机上看到 RTS /CTS、DTR /DSR 和 XON /XOFF 的选项,这是 对流控制的选项。
 
 - 
                    
- 空闲位
 - 
                                
处于逻辑“1”状态,表示当前线路上没有数据传送,该位为协议位,自动产生。
 
 - 
                    
- 波特率 BaudRate
 - 
                                
是衡量数据传送速率的指标。表示每秒钟传送的 bit 数。比如波特率 115200,表示传输速率是 115200 bps。
 
 
- 
                    
串口、COM 口是指的物理接口形式 (硬件)。
 - 
                    
TTL、RS-232、RS-485 是指的电平标准 (电信号)。
 
参数信息
在 UART 进行通信的时候,双方需要协商相关参数,否则无法进行信息解析,因此在通信之初,需要对所使用的工具设置上述的所有参数:

常用接口
- TTL
- 
                                
TTL 标准是低电平 (0V)为 0,高电平 (+5V)为 1。
 - 
                                
TTL 接口需要对端接口也为 TTL,但诸如 PC 等设备无 TTL 接口的 UART 口,一般转 TTL 为 USB 等 PC 更通用的接口。
 - 
                                
TTL 接口为全双工,连接设备的时候一般只接 GND/RX/TX。不会接 Vcc 或者 +3.3v 的电源线,避免与目标设备上的供电冲突,但 GND 可以保证源设备和目标设备供地,有助于信号稳定。
 - 
                                
信号线采用交叉的方式,即源端的 RX 连接目标设备的 TX,源端的 TX 连接目标设备的 RX。
 
 - 
                                
 - RS232
- 
                                
RS232 标准是正电平 (+3V~+15V)为 0,负电平 (-13V~-15V)为 1。
 - 
                                
RS232 接口在总线上只允许连接 1 个收发器,单站能力。
 - 
                                
RS232 传输线采用屏蔽双绞线,最高传输距离一般为 15M,最大速率为 20Kbps。
 - 
                                
RS232 接口为全双工,连接设备的时候一般只接 GND/RX/TX。
 - 
                                
信号线也采用交叉的方式,即源端的 RX 连接目标设备的 TX,源端的 TX 连接目标设备的 RX。
 
 - 
                                
 - RS422
- 
                                
RS422 标准采用差分信号负逻辑,逻辑“1”以两线间的电压差为+(2—6)V 表示。逻辑“0”以两线间的电压差为-(2—6)V 表示。接口信号电平比 RS232 降低了,就不易损坏接口电路的芯片,且该电平与 TTL 电平兼容,可方便与 TTL 电路连接。
 - 
                                
RS422 接口在总线上是允许连接多达 128 个收发器,多站能力。
 - 
                                
RS422 的数据最高传输速率为 10Mbps,100 米长双绞线的最大速度为 1Mb/s。
 - 
                                
RS422 采用平衡发送和差分接收,因此具有抑制共模干扰的能力。RS422 接口的最大传输距离标准值为 4000 英尺 (约 1219 米),实际上可达 3000 米。
 - 
                                
RS422 是全双工,连接设备的时候一般接 RX+/RX-/TX+/TX-/GND。
 - 
                                
信号线也采用交叉的方式,即源端的 RX-/RX+ 连接目标设备的 TX-/TX+,源端的 TX-/TX+ 连接目标设备的 RX-/RX+。
 
 - 
                                
 - RS485
- 
                                
RS485 的电气性能和 RS422 完全一样,主要区别是 RS485 是半双工。连接设备的时候一般接 A-/A+/GND,DB9 接口定义了两组,同时必须使用同一组的+/-。
 - 
                                
信号线也采用交叉的方式,即源端的 A- 连接目标设备的 A-,源端的 A+ 连接目标设备的 A+。
 
 - 
                                
 
插头
- 
                        
针形的为公头,孔形的为母头。
 - 
                        
PC 串口一般为公头,设备的一般为母头。
 

- 
                    
DCD/RI:电气 Ready 参数。
 - 
                    
DTR/DSR:模块 Ready 参数。
 - 
                    
RTS/CTS:流控参数。
 - 
                    
RXD/TXD:数据收发。
 
针序  | RS232  | 说明  | RS422  | 说明  | RS485  | 说明  | 
|---|---|---|---|---|---|---|
1  | DCD  | 数据载波检测  | RXD-  | 接收  | A-  | 组 1  | 
2  | RXD  | 接收数据  | -  | -  | -  | -  | 
3  | TXD  | 发送数据  | -  | -  | -  | -  | 
4  | DTR  | 数据终端准备好  | TXD+  | 发送  | A+  | 组 2  | 
5  | GND  | 信号地  | GND  | 信号地  | GND  | 信号地  | 
6  | DSR  | 数据准备好  | RXD+  | 接收  | A+  | 组 1  | 
7  | RTS  | 请求发送  | RTS  | 请求发送  | RTS  | 请求发送  | 
8  | CTS  | 清除发送  | CTS  | 清除发送  | CTS  | 清除发送  | 
9  | RI  | 响铃指示  | TXD-  | 发送  | A-  | 组 2  | 
流控
这里讲到的 “流”,指的是数据流。在数据通信中,流控制是管理两个节点之间数据传输速率的过程,以防止出现接收端的数据缓冲区已满,而发送端依然继续发送数据,所导致数据丢失。
当接收端的数据缓冲区已满,无法处理数据来时,就发出 “不再接收” 的信号,发送端则停止发送,直到发送端收到 “可以继续发送” 的信号再发送数据。
- 硬件流控
RTS/CTS 属于硬件握手的一种,最初是设计为电传打字机和调制解调器半双工协作通信的,每次它只能一方调制解调器发送数据。终端必须发送请求发送信号然后等到调制解调器回应清除发送信号:

 - 软件流控
软件流控制 (Software flow control)是在计算机数据链路中的一种流控制方法,特别适用于 RS232 串口通信。它是采用特殊字符来传输带内信令,特殊编码字符称作 XOFF 与 XON(分别表示 “transmit off” 与 “transmit on”)。因此,也被称作 “XON /XOFF 流控制”。
码的名字
含义
ASCII
十进制
十六进制
XOFF
暂停传输
DC3
19
13
XON
恢复传输
DC1
17
11
A 端的 DTR(数据设备就绪)发出信号, 当 B 端准备好后,B 端的 DTR(数据设备就绪)向 A 端的 DSR(通讯设备就绪)发出信号。 接下来就可以通过 RTS(请求发送)和 DTR(允许发送)来控制通信。
 
RAW 模式
UART 作为 tty 设备工作时,有两种工作方式:
- Canonical Input
RX 端接收到数据之后不会直接反馈给用户态的 read 函数,而是要一直等到一个回车,意即对一些特殊字符进行语意解析。
 - Raw Input
RX 端接收到什么直接返回到用户空间的 read 函数里面。
 
两种工作模式均为 kernel 层逻辑,和驱动/硬件无关,对于普通的 uart 应用,建议 Canonical 方式,对于 RS485 应用,建议使用 Raw 方式,二者通过 termios 的 lflag 参数的 ICANON 位进行区分。
