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 位进行区分。