- Universal synchronous / asynchronous receiver transmitter
- 通用同步 / 异步 接收发送器,俗称"串口"
通信相关概念
单工/双工/全双工/半双工
- 对通信方向的描述
- 单工,指通信方向只能是从A到B
- 双工,指通信方向可以从A到B,也可以B到A
- 全双工和半双工的区别在于,在同一个时刻,是否A和B能同时向对方发送数据
异步/同步
- 区别在于通信双方是否有同步信号CLK,异步:没有,同步:有
- 同步通信


- 异步通信


- 常见的异步通信方式有:串口(UART),USB,CAN
- 常见的同步通信方式有:SPI,I2C等
串行/并行
- 串行通信,指数据在数据线上,一位一位的顺序传送
- 并行通信,指同时有多位数据在多条数据线上一起传送
- 并行通信效率高,但占用的数据通信线多,一般用于MCU与存储器、高分辨率的显示屏的通信
- 串行通信效率低,但占用的数据通信线少,线路简单
UART 通信
- UART理论上是全双工异步串行通信
- 波特率:每秒传输二进制数的位数,单位是位/秒,缩写成bps,例如115200bps,表示每秒传输115200个二进制位,波特率通常是约定的值,不任意取值,常见的有4800,9600,19200,38400,57600,115200,还可以更高
- 起始位 Start Bit:没有数据传输的时候,数据发送脚必须是逻辑1,开始传输数据,则每个字节需要有1位时间的逻辑0,通知接收方
- 有效数据:跟在起始位后面的正式数据,通常为8位,注意,传输过程是低位在先(LSB)
- 数据校验:在有效数据之后,有一个可选的数据校验位。用于检查传输过程中是否由于干扰造成数据错误。校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)以及无校验(noparity)
- 奇校验:要求有效数据和校验位中"1"的个数为奇数,比如有效位数据为"01000010",其中有2个"1",则校验位需要为"1",让"1"的个数为奇数
- 偶校验:和奇校验相反,要求有效数据和校验位中"1"的个数位偶数
- 停止位 Stop Bit:有效数据传输完成后,标志传输停止的数据位,必须是逻辑1,持续位宽可以是1或2位时间
数据通信格式

- 示例

- UART 通信的基本单位是一帧数据:
latex
┌─────────┬──────────────┬─────────────┬─────────────┐
│ 起始位 │ 数据位 │ 校验位 │ 停止位 │
│ (Start) │ (Data bits) │ (Parity) │ (Stop) │
├─────────┼──────────────┼─────────────┼─────────────┤
│ 1 bit │ 5~8 bits │ 0 or 1 bit │ 1~2 bits │
│ 逻辑0 │ LSB 先传 │ 可选 │ 逻辑1 │
└─────────┴──────────────┴─────────────┴─────────────┘
| 字段 | 电平 | 作用 |
|---|---|---|
| 起始位 | 逻辑 0 | 通知接收方"数据要来了",用于同步 |
| 数据位 | 0/1 | 实际传输的数据,低位先传(LSB First) |
| 校验位 | 0/1 | 可选,用于检错(奇校验或偶校验) |
| 停止位 | 逻辑 1 | 标志一帧结束,给接收方准备下一帧的时间 |
通信流程
latex
发送端 TX: 空闲(高) [起始位0] [数据位 LSB→MSB] [校验位] [停止位1] 空闲(高)
↓ ↓ ↓ ↓ ↓
接收端 RX: 空闲(高) 检测下降沿 中间点采样 检错 检测停止位 存入缓冲区
参数约定
| 参数 | 说明 | 常见值 |
|---|---|---|
| 波特率 | 每秒传输的位数 | 9600, 115200, 460800 等 |
| 数据位 | 每帧数据的有效位数 | 5, 6, 7, 8 位(常用 8 位) |
| 停止位 | 每帧结束的标志位数 | 1, 1.5, 2 位(常用 1 位) |
| 校验位 | 可选,用于简单检错 | 无校验、奇校验、偶校验 |
这些参数必须收发双方完全一致,否则通信会乱码
发送流程
- 以发送一个字节 0x53 为例,假设配置:9600 波特率,8 数据位,1 停止位,无校验
步骤 1:空闲状态
- TX 线保持高电平(逻辑 1),表示线路空闲
步骤 2:发送起始位
- TX 线拉低(逻辑 0),持续 1 个位时间(1/9600 ≈ 104μs)
- 接收方检测到这个下降沿,开始同步
步骤 3:发送数据位
- 从 LSB(最低位) 开始,逐位发送数据
- 0x53 = 0101 0011(二进制)
- 发送顺序:1 → 1 → 0 → 0 → 1 → 0 → 1 → 0(从低位到高位)
- 每个位持续 1 个位时间
步骤 4:发送校验位
- 如果有校验位,在此发送
步骤 5:发送停止位
- TX 线拉高(逻辑 1),持续 1 个位时间(或 1.5/2 个)
- 接收方检测到停止位,知道一帧结束
步骤 6:可选的空闲或下一帧
- 如果没有下一帧数据,TX 保持高电平空闲
- 如果有下一帧数据,重复步骤 2~5
接收流程
- 接收方的采样时机是关键:
- 采样策略(以过采样为例)
- UART 控制器通常使用 16 倍波特率时钟进行过采样
- 在检测到起始位(下降沿)后,在每个位的中间点进行采样,避免边沿抖动
- 接收步骤
- 检测起始位:检测到 TX 线从高→低跳变,开始同步
- 采样数据位:在每个数据位的中间点采样,得到 8 位数据(LSB 先到)
- 校验(可选):计算校验位,与接收到的校验位对比,不一致则标记错误
- 检测停止位:确认停止位为高电平,否则标记帧错误
- 存入缓冲区:将接收到的字节存入 RX 缓冲区,供 CPU 读取
UART通信的与TTL\232\485关系
TTL电平串行通信

- 简单的说,MCU的UART引脚发出的电平就是TTL电平
- 用低电平(0V)表示逻辑0(也称之为 space ,空号),用高电平(3.3V或5V)表示逻辑1(也称之为 mark , 传号),这种编码模式称之为 NRZ码------不归零编码
- 收发双方的发送和接收需要交叉连接。一般通信距离小于1m

RS232串行通信


- 用-3V~-15V表示逻辑1,+3~+15V表示逻辑0
- 可以增加传输距离,最大15米
- 有RTS、CTS、DSR、DTR和DCD等控制线
- 一般使用DB9接口
硬件流控
在通信双方处理数据的速度不匹配时使用
RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平
有效,低电平说明本设备可以接收数据
CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有
效,低电平说明本设备可以向对方发送数据
RS485串行通信


- 用一对双绞线传输数据,用线A和线B的相对电压表示逻辑电平,称之为差分电平
- 发送端:逻辑"1"以两线间的电压差 +2V ~ +6V 表示;逻辑"0"以两线间的电压差 -2V ~ -6V表示
- 接收端:A 比B 高200mV 以上即认为是逻辑"0",A 比B 低200mV 以上即认为是逻辑"1"
- 适合远距离传输,波特率位9600bps时,可达1200米
- 只能半双工传输,通常是一主多从结构,最多128个从机
注意
- 不同的电平之间转换------TTL电平的串口绝不能和RS232电平的串口直接连接通信,会损坏接口
- 接口一般不能热插拔------热插拔容易产生浪涌,导致接口芯片损坏。
- TTL和RS232需要共地------共模信号需要有共同的参考地电平才能判断出高低电平。
- 可以一发多收,但不能多发一收------驱动能力够的前提下,串口允许一发多收,类似于广播,但不能多发一收,电平会混乱甚至烧毁硬件电路。
- 注意MCU时钟频率误差对通信的影响------波特率越高,时钟误差的影响越大