1. 先建立整体认识
刚接触这些名称时,很容易把它们都叫作“通信协议”。严格来说,它们并不完全处在同一个层次。
| UART(串口) | 数据按什么格式一位一位发送 | 规定说话的节奏和句子格式 |
| RS232 | UART 数据用什么电压传输 | 两个人近距离打电话的线路标准 |
| RS485 | UART 数据怎样抗干扰、远距离、多节点传输 | 多人共用的一条工业电话线 |
| I²C | 板内多个低速芯片如何用两根线通信 | 主机点名,从机回答 |
| SPI | 板内芯片怎样进行高速同步通信 | 主机用独立片选叫某个从机工作 |
| CAN | 多个节点如何可靠、实时地争用总线 | 按消息优先级自动排队的广播网络 |
最需要先记住的一句话是:
UART 不等于 RS232,也不等于 RS485。UART 负责组织数据,RS232 和 RS485主要负责把数据变成适合在线缆上传输的电信号。
典型连接关系如下:
MCU UART ──TTL电平── RS232收发器 ──RS232电平── RS232设备
MCU UART ──TTL电平── RS485收发器 ──A/B差分线── RS485总线
2. 理解通信协议前的五个关键词
2.1 串行与并行
-
串行通信:数据按位依次发送,线少、适合较远距离。本文介绍的接口都属于串行通信。
-
并行通信:多位数据同时发送,线多,容易受到各位信号到达时间不一致的影响。

2.2 同步与异步
-
同步通信:有时钟线,接收方跟着时钟采样,例如 I²C、SPI。
-
异步通信:没有时钟线,双方提前约定速率,例如 UART。

2.3 单端与差分
-
单端信号:用一根信号线相对 GND 的电压表示 0 和 1,电路简单,但更容易受干扰。
-
差分信号:用两根线之间的电压差表示 0 和 1,抗干扰能力更强,例如 RS485、CAN。
2.4 单工、半双工与全双工
-
单工:只能沿一个方向发送。
-
半双工:双方都能发送,但不能同时发送,类似对讲机。
-
全双工:双方可以同时发送和接收,类似打电话。

2.5 波特率与比特率
-
比特率:每秒传输的二进制位数,单位是 bit/s。
-
波特率:每秒发生的码元变化次数。
比特率 = 波特率 * log2M
UART 通常一个码元只表示一位,因此工程中经常把波特率近似理解为比特率。不过一帧数据还包含起始位、停止位等开销。例如 115200-8-N-1 发送一个字节需要 10 位,所以理论有效数据率约为:
115200 ÷ 10 = 11520 Byte/s
3. UART 串口
3.1 一句话理解
UART 是一种没有时钟线的异步串行收发方式,通信双方依靠提前约定的波特率和帧格式来正确采样数据。
3.2 基本接线

设备A TX ─────────→ 设备B RX
设备A RX ←───────── 设备B TX
设备A GND ───────── 设备B GND
TX 和 RX 要交叉连接,同时需要共地。只进行单向通信时可以只接一根数据线和 GND。
3.3 UART 数据帧
常见配置 115200-8-N-1 表示:
-
波特率:115200 bit/s
-
数据位:8 位
-
校验位:无校验(N,None)
-
停止位:1 位
一帧数据的结构通常为:
空闲高电平 → 起始位0 → 数据位(常见低位先发)→ 校验位(可选)→ 停止位1
发送端用起始位通知接收端“新的一帧开始了”,接收端随后根据波特率在每一位中间进行采样。双方波特率偏差过大时,采样点会逐渐偏移,最终产生乱码或帧错误。
3.4 优点与局限
优点:
-
接口简单,几乎所有 MCU 都支持。
-
全双工,适合调试信息和模块通信。
-
软件配置和抓包分析比较容易。
局限:
-
原生 TTL/CMOS 电平适合板内或短距离连接。
-
没有地址、应答、重发等统一机制。
-
多设备组网不方便。
3.5 初学者易错点
-
两个设备的 TX 不能接 TX,应该 TX 接 RX。
-
两端的波特率、数据位、校验位和停止位必须一致。
-
3.3V MCU 不一定能承受 5V UART 信号,需要查看芯片手册。
-
UART 的奇偶校验只能发现一部分错误,不能替代 CRC。
4. RS232
4.1 一句话理解
RS232 将 UART 数据转换为正负电压进行单端、点对点传输,常用于电脑、仪器和传统工业设备。

4.2 为什么不能直接连接 MCU
MCU 的 UART 通常使用 0V 和 3.3V(或 5V)表示逻辑电平,而标准 RS232 使用正负电压,并且逻辑含义通常相反:
| 逻辑 1 | 高电平 | -3V ~ -15V |
| 逻辑 0 | 低电平 | +3V ~ +15V |
| 不确定区 | 取决于器件 | -3V ~ +3V |
因此 MCU 与 RS232 设备之间要加入 MAX232、SP3232 等收发器,完成升压、产生负压和逻辑反相。

4.3 通信方式
最简单的 RS232 通信使用三根线:
-
TXD:发送数据
-
RXD:接收数据
-
GND:信号地
TXD 和 RXD 独立,因此可以全双工通信。标准接口还可能包含 RTS、CTS 等硬件流控信号。
4.4 优点与局限
优点:兼容大量传统设备,点对点连接简单,全双工。
局限:单端传输抗干扰能力一般,不能直接组成多节点总线,距离和速度不适合同时做得很高。传统工程中常把 15m 左右作为保守距离参考,实际能力与线缆、速率和环境有关。
4.5 初学者易错点
-
DB9 接口不代表一定是 RS232,需要查看设备说明书。
-
不能把 RS232 电平直接接入 STM32 引脚。
-
DTE 与 DCE 设备的 TX/RX 定义不同,连接前应核对引脚,而不是只看插头公母。
5. RS485
5.1 一句话理解
RS485 使用 A、B 两根线的电压差传输数据,适合远距离、强干扰和多节点工业现场。

5.2 差分传输为什么抗干扰
接收器判断的是两根线之间的电压差:
Vdiff = VA – VB
如果外界干扰同时让 A、B 两线都升高 1V,它们之间的差值基本不变,因此接收结果不容易受到影响。这就是差分传输比单端传输更适合工业环境的主要原因。

5.3 两线半双工通信
最常见的 RS485 使用 A、B 两根数据线,所有节点共享总线,同一时刻通常只允许一个节点发送。
MCU 除了 UART TX/RX,通常还要控制收发器的 DE 和 /RE:
准备发送 → 使能发送器 → UART发送 → 等待最后一位真正发完 → 切回接收
如果数据刚写入发送寄存器就切回接收,最后几个字节可能还没有传到总线上。因此应等待 UART 的“发送完成”标志,而不只是“发送数据寄存器为空”。
5.4 终端、拓扑和协议
-
总线物理上的两端通常各接一个约 120Ω 终端电阻。
-
断电测量总线两端,两个 120Ω 并联后的等效电阻约为 60Ω。
-
推荐手拉手的总线型拓扑,避免星形连接和过长支线。
-
总线空闲状态不稳定时,可以按芯片手册增加偏置电阻。
-
传统 RS485 的 32 个单位负载不是绝对节点上限,现代 1/2、1/4、1/8 单位负载收发器可支持更多节点。
RS485只规定电气层,不规定地址和报文内容。项目中常在它上面运行:
-
Modbus RTU
-
Profibus 的部分物理实现
-
自定义“地址 + 命令 + 数据 + CRC”协议
5.5 优点与局限
优点:抗干扰强、距离远、支持多节点、成本较低。
局限:常见两线模式是半双工;总线同时发送会冲突;地址、仲裁、重发和错误处理需要上层协议设计。

6. I²C(IIC)
6.1 一句话理解
I²C 是一种两线、同步、带地址的板级总线:主机产生时钟并点名地址,从机匹配地址后进行应答。

6.2 两根信号线
-
SCL:串行时钟线
-
SDA:串行数据线
SCL 和 SDA 通常采用开漏结构:设备可以主动把线拉低,但不能主动输出高电平,释放总线后由上拉电阻把线拉高。这样多个设备就不会出现一个输出高、另一个输出低而造成的硬件短路,也为应答和多主仲裁提供了基础。
上拉电阻并非固定为 4.7kΩ。阻值需要结合电源电压、总线电容、目标速度和器件灌电流能力选择:
-
电阻太大:上升沿慢,高速时可能采样失败。
-
电阻太小:低电平电流增大,器件可能拉不动。
6.3 起始与停止条件
总线空闲时,SCL 和 SDA 都为高电平:
-
SCL 为高时,SDA 从高变低:START 起始条件。
-
SCL 为高时,SDA 从低变高:STOP 停止条件。
-
正常传输中,SDA 应在 SCL 低电平时改变,在 SCL 高电平时保持稳定。

6.4 一次写寄存器的过程
START
→ 7位从机地址 + 写方向位0
→ 从机ACK
→ 寄存器地址
→ 从机ACK
→ 要写入的数据
→ 从机ACK
→ STOP
每发送 8 位数据,第 9 个时钟用于应答:
-
ACK:接收方拉低 SDA,表示“已收到,可以继续”。
-
NACK:SDA 保持高电平,可能表示地址无人响应、接收结束或设备忙。
读取寄存器时常用“重复起始”过程:
START → 地址+写 → 寄存器地址 → RESTART → 地址+读 → 数据 → NACK → STOP
6.5 地址和速度
I²C 常用 7 位地址。资料中有时会把 7 位地址左移一位并加上读写位,写成“8 位地址”,这是驱动开发中常见的地址混淆来源。
常见速度模式包括:
| Standard-mode | 100 kbit/s |
| Fast-mode | 400 kbit/s |
| Fast-mode Plus | 1 Mbit/s |
| High-speed mode | 3.4 Mbit/s |
并非所有 MCU 和从机都支持全部模式。
6.6 优点与局限
优点:只用两根信号线即可连接多个设备;自带地址和应答;很适合低速传感器、EEPROM、RTC。
局限:速度和距离受总线电容影响;地址可能冲突;总线被某个器件持续拉低时会卡死;半双工且协议开销比 SPI 大。
7. SPI
7.1 一句话理解
SPI 是一种由主机提供时钟和片选的高速同步接口,MOSI 与 MISO 分开,因此能够全双工传输。

7.2 四类信号
| SCLK | 主机 → 从机 | 主机产生通信时钟 |
| MOSI | 主机 → 从机 | 主机输出、从机输入 |
| MISO | 从机 → 主机 | 主机输入、从机输出 |
| CS/NSS | 主机 → 从机 | 选中目标从机,通常低有效 |
每增加一个普通 SPI 从机,通常要额外占用一根片选线。多个从机可以共用 SCLK、MOSI 和 MISO,但未被片选的从机必须释放 MISO。
7.3 SPI 为什么能全双工
主机和从机内部都可以看成一个移位寄存器。每产生一个时钟,两端各移出一位,同时移入一位:
主机移位寄存器 ──MOSI──→ 从机移位寄存器
主机移位寄存器 ←─MISO─── 从机移位寄存器
因此读取从机时,主机也必须发送一些占位数据来产生时钟;常见占位值是 0x00 或 0xFF,具体看器件手册。
7.4 四种 SPI 模式
CPOL 决定时钟空闲电平,CPHA 决定在哪个边沿采样:
| Mode 0 | 0 | 0 | 低 |
| Mode 1 | 0 | 1 | 低 |
| Mode 2 | 1 | 0 | 高 |
| Mode 3 | 1 | 1 | 高 |
主从设备的模式必须一致。模式错误时,常见现象是数据整体错一位、数值不稳定或完全读不到数据。
7.5 SPI 没有统一的数据帧
SPI 规定了基本信号和移位过程,但没有统一规定:
-
从机地址
-
寄存器地址长度
-
命令格式
-
应答方式
-
CRC 和重发
所以使用 SPI 芯片时必须阅读数据手册中的时序图。某些芯片要求 CS 在一整条命令期间保持低电平,有些芯片还要求命令和数据之间插入空时钟。
7.6 优点与局限
优点:速度高、全双工、协议开销小、时序直观。
局限:占用引脚较多;没有统一应答和错误检测;通常只适合 PCB 板内短距离通信;频率升高后需要认真处理走线、阻抗、串扰和边沿质量。
8. CAN
8.1 一句话理解
CAN 是一种差分、多主机、面向消息的可靠总线,多个节点同时发送时,会根据消息标识符进行无损仲裁。

8.2 CAN 不是按设备地址发送
CAN 报文中的标识符描述的是“这是什么消息”,而不是“发给哪台设备”。例如:
ID 0x101:电机转速
ID 0x102:电机温度
ID 0x201:控制指令
所有节点都能看到总线上的报文,每个节点通过过滤器选择自己关心的标识符。这种方式非常适合一个数据被多个节点同时使用的场景。
8.3 差分信号与显性、隐性
CAN 使用 CAN_H 和 CAN_L 两根差分线:
-
显性位:逻辑 0
-
隐性位:逻辑 1
显性 0 可以覆盖隐性 1。这个“线与”特性使多个节点能一边发送一边监听总线,并完成仲裁。

8.4 无损仲裁过程
假设节点 A 和节点 B 同时发送:
节点A标识符:001 0010 0000(0x120)
节点B标识符:000 1000 0000(0x080)
↑
某一位上,节点 A 发送隐性 1,却从总线读到显性 0,就知道有更高优先级的报文正在发送,于是立即停止发送。节点 B 继续传输,原报文没有被破坏,所以称为“无损仲裁”。
结论:
CAN 标识符数值越小,优先级越高。标识符代表消息含义,同时也承担总线优先级设计。
8.5 CAN 为什么可靠
CAN 控制器内置了较完整的错误处理机制:
-
CRC 校验
-
ACK 应答
-
位监测
-
位填充检查
-
帧格式检查
-
出错后自动重发
-
发送错误计数和接收错误计数
-
错误主动、错误被动和总线关闭等故障隔离状态
持续出错的节点最终会进入 Bus-Off,避免它一直干扰整个网络。
8.6 经典 CAN 与 CAN FD
| 单帧最大数据 | 8 Byte | 64 Byte |
| 数据阶段速率 | 与仲裁段相同 | 可切换到更高速率 |
| 典型用途 | 传统汽车与工业控制 | 更高吞吐量的新系统 |
经典 CAN 的标称速率最高通常为 1 Mbit/s。通信距离与速率存在明显权衡:速率越高,允许的总线越短。具体值应根据收发器、线缆、拓扑和采样点设计确定。
8.7 布线注意事项
-
总线两端各使用一个 120Ω 终端电阻。
-
推荐总线型拓扑,支线尽量短。
-
CAN 控制器不能直接连接 CAN_H/CAN_L,中间需要 CAN 收发器。
-
地电位差较大或安全要求高时,应使用隔离 CAN 收发器。
9. 六种通信方式横向对比
9.1 核心能力对比
| 主要定位 | 异步串行收发 | 单端物理层 | 差分物理层 | 板级总线 | 板级高速接口 | 可靠现场总线 |
| 是否有时钟线 | 否 | 否 | 否 | 是 | 是 | 否 |
| 信号方式 | TTL/CMOS单端 | 正负电压单端 | 差分 | 开漏单端 | 推挽单端 | 差分 |
| 常见数据线 | TX、RX | TXD、RXD | A、B | SCL、SDA | SCLK、MOSI、MISO、CS | CAN_H、CAN_L |
| 双工方式 | 全双工 | 全双工 | 两线常为半双工 | 半双工 | 全双工 | 半双工 |
| 多节点能力 | 通常无 | 点对点 | 支持 | 支持 | 多从机 | 多主机 |
| 寻址方式 | 无 | 无 | 上层协议定义 | 7位/10位地址 | 片选线 | 消息标识符 |
| 仲裁机制 | 无 | 无 | 无 | 支持多主仲裁 | 无 | 无损位仲裁 |
| 错误处理 | 可选奇偶校验 | 依赖上层 | 依赖上层 | ACK/NACK | 依赖器件协议 | CRC、ACK、重发、故障隔离 |
| 抗干扰能力 | 较弱 | 一般 | 强 | 较弱 | 较弱 | 强 |
| 典型距离 | 板内/短距离 | 短距离 | 可达数百米至千米级 | PCB板内 | PCB板内 | 数十米至数百米 |
| 典型速度特点 | 中等 | 中低 | 距离越长速度越低 | 中低速 | 高速 | 实时性和可靠性优先 |
9.2 成本与开发难度
| UART | 低 | 2 | 低 | 低 |
| RS232 | 需要收发器 | 2 | 低 | 低 |
| RS485 | 需要收发器和方向控制 | 2~3 | 中,需上层协议 | 中 |
| I²C | 低,需要上拉 | 2 | 中 | 中 |
| SPI | 低 | 3+N个片选 | 低到中 | 中 |
| CAN | 需要控制器和收发器 | 2 | 较高 | 较高 |
9.3 典型应用
| 打印 STM32 调试日志 | UART 转 USB | 简单、电脑端工具多 |
| 连接传统仪器或旧工控机 | RS232 | 设备接口兼容 |
| 工厂中连接多个仪表 | RS485 + Modbus RTU | 距离远、抗干扰、多节点 |
| 连接温湿度传感器、RTC | I²C | 两根线可挂多个低速器件 |
| 连接 Flash、ADC、显示屏 | SPI | 速度高、开销小 |
| 汽车节点或高可靠控制网络 | CAN | 仲裁、校验、重发和故障隔离完善 |
10. 选型时怎么快速判断
可以按下面的顺序思考:
是不是同一块 PCB? 如果是,优先考虑 UART、I²C 或 SPI。
引脚是否紧张、设备是否较慢? 是则优先 I²C。
是否需要高速连续传输? 是则优先 SPI。
是否只是两个设备简单通信或打印日志? 是则使用 UART。
是否需要连接标准 RS232 仪器? 是则使用 UART + RS232 收发器。
是否距离较远、节点较多、成本敏感? 是则考虑 RS485,并选择 Modbus RTU 等上层协议。
是否要求多主机、实时仲裁和强错误处理? 是则选择 CAN。
一句话速记:
板内低速少引脚用 I²C,板内高速用 SPI,简单调试用 UART;传统设备用 RS232,远距离多节点用 RS485,高可靠实时网络用 CAN。





![[FreeRTOS]框架代码介绍+函数讲解-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260822074021-6a895265e1708-220x150.png)