UART(通用异步收发器)
UART((Universal Asynchronous Receiver Transmitter)是一种通用的串行、异步 通信总线,它有两条数据线(TX、RX),可以实现全双工的发送和接收。
复习下常见概念:
-
串行通信 :只用 1 根数据线,数据按位依次排队,逐位顺序发送、逐位接收。
-
并行通信 :多根数据线并行,多位 数据(如 8 位、16 位)同一时刻同时传输。

-
异步通信 :无公共时钟线,收发双方使用各自独立时钟,依靠协议约定(起始位、停止位、校验位)实现数据对齐。
-
同步通信 :通信双方共用同一根时钟线(CLK) ,所有数据收发严格跟随统一时钟节拍。

-
单工通信 :单向永久固定通信,一端只能发送,一端只能接收,无法反向。
-
半双工通信 :支持双向传输 ,但同一时刻只能单独发或单独收,收发不能同时进行,需要切换方向。
-
全双工通信 :收发通道完全独立,发送和接收可以同时进行 ,互不占用、互不阻塞。

-
波特率:每秒传输码元(通信线路上一次信号变化的波形/电平组合,是信号的最小单位。)的数量。
-
比特率 :每秒传输二进制比特 (0/1) 的数量,代表真实数据速度。

N:一个码原能够表示的状态数,例如:对于UART、RS232串口,1个码原只能表示高低电平两种状态,则N=2,比特率=波特率。
UART帧格式

- 串口可以发送5-8位,可以是5、6、7、8位(最多8位),先发低位再发高位。
- 校验位:分为奇校验、偶校验和无校验三种模式。数数据位中有多少个1,如果是偶校验,数据位中有偶数个1,则校验位为0,反之为1;如果是奇校验,数据位中有奇数个1,则校验位为0,反之为1。简单来讲,偶校验凑偶数个 1,奇校验凑奇数个 1。
举个例子来理解一下UART的数据发送,从设备A端发送0x55(01010101)到设备B端,校验位选择偶校验,则波形如下:

有没有想过为什么UART串口一次最多只能发送8位数据?
首先,前面我们说到,UART串口是异步通信的,异步通信没有统一时钟,收发双方的时钟频率存在微小偏差。每传输一位,误差就会累积一点。如果帧太长(比如超过 8 位),到帧末尾时,接收端的采样点可能已经偏移到下一个比特的电平区间,导致采样错误、数据乱码。其次,计算机最小能寻址单位是1字节(8位),发送8位数据方便CPU处理,不需要额外的拆分或拼接。此外,8 位数据位能覆盖 ASCII 字符集(0~127),满足绝大多数文本通信需求,同时也能传输二进制数据。
那为什么UART串口一次最少要发送5位数据?
早期电传打字机使用 5 位编码(Baudot 码)来表示字母、数字和控制字符,刚好能覆盖当时的通信需求。UART 协议为了兼容这些老式设备,保留了5 位数据位的最小配置。此外,如果数据位少于 5 位,加上起始位、停止位后,整帧长度过短,接收端很难可靠地识别起始位和停止位,容易被噪声干扰误判为有效帧,导致通信不稳定。
UART硬件连接

注意TXD与RXD连接,否则无法进行通信。
数据转换
如何将二进制转换成可读的文本信息呢?
将二进制数据还原成字节流(1字节=8位二进制),按照约定的字符编码规则把字节映射成字符。常见编码表有:

以ASSCII编码规则为例:如果发送端依次发送了0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64,将这几个字节转换成十进制:72,101,108,108,111,32,87,114,108,100,这些十进制在ASCII码表中对应的是:72(H),101(e),108(l),108(l),111(o),32(空格),87(W),111(o),114®,108(l),100(d),即:Hello World。