目录
[2.1 串行与并行](#2.1 串行与并行)
[2.2 同步与异步](#2.2 同步与异步)
[2.3 单端与差分](#2.3 单端与差分)
[2.4 单工、半双工与全双工](#2.4 单工、半双工与全双工)
[2.5 波特率与比特率](#2.5 波特率与比特率)
[3.1 一句话理解](#3.1 一句话理解)
[3.2 基本接线](#3.2 基本接线)
[3.3 UART数据帧](#3.3 UART数据帧)
[3.4 优点与局限](#3.4 优点与局限)
[3.5 初学者易错点](#3.5 初学者易错点)
[4.1 一句话理解](#4.1 一句话理解)
[4.2 为什么不能直接连接MCU](#4.2 为什么不能直接连接MCU)
[4.3 通信方式](#4.3 通信方式)
[4.4 优点与局限](#4.4 优点与局限)
[4.5 初学者易错点](#4.5 初学者易错点)
[5.1 一句话理解](#5.1 一句话理解)
[5.2 差分传输为什么抗干扰](#5.2 差分传输为什么抗干扰)
[5.3 两线半双工通信](#5.3 两线半双工通信)
[5.4 终端、拓扑和协议](#5.4 终端、拓扑和协议)
[5.5 优点与局限](#5.5 优点与局限)
[6.1 一句话理解](#6.1 一句话理解)
[6.2 两根信号线](#6.2 两根信号线)
[6.3 起始与停止条件](#6.3 起始与停止条件)
[6.4 一次写寄存器的过程](#6.4 一次写寄存器的过程)
[6.5 地址和速度](#6.5 地址和速度)
[6.6 优点与局限](#6.6 优点与局限)
[7.1 一句话理解](#7.1 一句话理解)
[7.2 四类信号](#7.2 四类信号)
[7.3 SPI为什么能全双工](#7.3 SPI为什么能全双工)
[7.4 四种SPI模式](#7.4 四种SPI模式)
[7.5 优点与局限](#7.5 优点与局限)
[8.1 一句话理解](#8.1 一句话理解)
[8.2 CAN不是按设备地址发送](#8.2 CAN不是按设备地址发送)
[8.3 差分信号与显性、隐性](#8.3 差分信号与显性、隐性)
[8.4 无损仲裁过程](#8.4 无损仲裁过程)
[8.5 CAN为什么可靠](#8.5 CAN为什么可靠)
[8.6 经典CAN与CAN FD](#8.6 经典CAN与CAN FD)
[9.1 核心能力对比](#9.1 核心能力对比)
[9.2 典型应用场景](#9.2 典型应用场景)
前言
刚接触嵌入式开发时,面对UART、RS232、RS485、I²C、SPI、CAN这些名词,很容易一头雾水。它们都被称为"通信协议",但实际上并不完全处于同一个层次。本文将从整体认知入手,逐一剖析每种通信方式的原理、特点和应用场景。
一、整体认识:它们不在同一个层次

首先,我们需要建立一个关键认知:
| 名称 | 主要解决问题 | 通俗理解 |
|---|---|---|
| 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.1 串行与并行
串行通信:数据按位依次发送,线少、适合较远距离。本文介绍的接口都属于串行通信。
并行通信:多位数据同时发送,线多,容易受到各位信号到达时间不一致的影响。
2.2 同步与异步
同步通信:有时钟线,接收方跟着时钟采样,例如I²C、SPI。
异步通信:没有时钟线,双方提前约定速率,例如UART。
2.3 单端与差分
单端信号:用一根信号线相对GND的电压表示0和1,电路简单,但更容易受干扰。
差分信号:用两根线之间的电压差表示0和1,抗干扰能力更强,例如RS485、CAN。
2.4 单工、半双工与全双工
-
单工:只能沿一个方向发送
-
半双工:双方都能发送,但不能同时发送,类似对讲机
-
全双工:双方可以同时发送和接收,类似打电话
2.5 波特率与比特率
-
比特率:每秒传输的二进制位数,单位是bit/s
-
波特率:每秒发生的码元变化次数
公式:比特率 = 波特率 × log₂M
UART通常一个码元只表示一位,因此工程中经常把波特率近似理解为比特率。不过一帧数据还包含起始位、停止位等开销。例如115200-8-N-1发送一个字节需要10位,所以理论有效数据率约为:115200 ÷ 10 = 11520 Byte/s
三、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)
-
停止位:1位
一帧数据的结构:
空闲高电平 → 起始位0 → 数据位(低位先发)→ 校验位(可选)→ 停止位1
3.4 优点与局限
优点:
-
接口简单,几乎所有MCU都支持
-
全双工,适合调试信息和模块通信
-
软件配置和抓包分析比较容易
局限:
-
原生TTL/CMOS电平适合板内或短距离连接
-
没有地址、应答、重发等统一机制
-
多设备组网不方便
3.5 初学者易错点
-
两个设备的TX不能接TX,应该TX接RX
-
两端的波特率、数据位、校验位和停止位必须一致
-
3.3V MCU不一定能承受5V UART信号
-
UART的奇偶校验只能发现一部分错误,不能替代CRC
四、RS232
4.1 一句话理解
RS232将UART数据转换为正负电压进行单端、点对点传输,常用于电脑、仪器和传统工业设备。
4.2 为什么不能直接连接MCU
MCU的UART通常使用0V和3.3V(或5V)表示逻辑电平,而标准RS232使用正负电压,并且逻辑含义通常相反:
| 逻辑 | TTL/CMOS UART | RS232接收端典型判定 |
|---|---|---|
| 逻辑1 | 高电平 | -3V ~ -15V |
| 逻辑0 | 低电平 | +3V ~ +15V |
因此MCU与RS232设备之间要加入MAX232、SP3232等收发器,完成升压、产生负压和逻辑反相。
4.3 通信方式
最简单的RS232通信使用三根线:TXD、RXD、GND。TXD和RXD独立,因此可以全双工通信。
4.4 优点与局限
优点:兼容大量传统设备,点对点连接简单,全双工
局限:单端传输抗干扰能力一般,不能直接组成多节点总线,距离和速度有限
4.5 初学者易错点
-
DB9接口不代表一定是RS232
-
不能把RS232电平直接接入STM32引脚
-
DTE与DCE设备的TX/RX定义不同
五、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发送 → 等待最后一位真正发完 → 切回接收
5.4 终端、拓扑和协议
-
总线两端各接一个约120Ω终端电阻
-
推荐手拉手的总线型拓扑
-
RS485只规定电气层,不规定地址和报文内容
5.5 优点与局限
优点:抗干扰强、距离远、支持多节点、成本较低
局限:常见两线模式是半双工;总线同时发送会冲突;需要上层协议设计
六、I²C(IIC)
6.1 一句话理解
I²C是一种两线、同步、带地址的板级总线:主机产生时钟并点名地址,从机匹配地址后进行应答。
6.2 两根信号线
-
SCL:串行时钟线
-
SDA:串行数据线
SCL和SDA采用开漏结构,由外部上拉电阻拉高,避免了多设备输出冲突。
6.3 起始与停止条件
-
起始条件:SCL为高时,SDA从高变低
-
停止条件:SCL为高时,SDA从低变高
6.4 一次写寄存器的过程
START → 7位从机地址 + 写方向位0 → 从机ACK → 寄存器地址 → 从机ACK → 数据 → 从机ACK → STOP
6.5 地址和速度
I²C常用7位地址。常见速度模式:
-
Standard-mode:100 kbit/s
-
Fast-mode:400 kbit/s
-
Fast-mode Plus:1 Mbit/s
-
High-speed mode:3.4 Mbit/s
6.6 优点与局限
优点:只用两根信号线即可连接多个设备;自带地址和应答
局限:速度和距离受总线电容影响;半双工且协议开销比SPI大
七、SPI
7.1 一句话理解
SPI是一种由主机提供时钟和片选的高速同步接口,MOSI与MISO分开,能够全双工传输。
7.2 四类信号
| 信号 | 方向 | 作用 |
|---|---|---|
| SCLK | 主机→从机 | 主机产生通信时钟 |
| MOSI | 主机→从机 | 主机输出、从机输入 |
| MISO | 从机→主机 | 主机输入、从机输出 |
| CS/NSS | 主机→从机 | 选中目标从机 |
7.3 SPI为什么能全双工
主机和从机内部都可以看成一个移位寄存器。每产生一个时钟,两端各移出一位,同时移入一位。
7.4 四种SPI模式
| SPI模式 | CPOL | CPHA | 时钟空闲电平 |
|---|---|---|---|
| Mode 0 | 0 | 0 | 低 |
| Mode 1 | 0 | 1 | 低 |
| Mode 2 | 1 | 0 | 高 |
| Mode 3 | 1 | 1 | 高 |
7.5 优点与局限
优点:速度高、全双工、协议开销小、时序直观
局限:占用引脚较多;没有统一应答和错误检测;通常只适合PCB板内短距离通信
八、CAN
8.1 一句话理解
CAN是一种差分、多主机、面向消息的可靠总线,多个节点同时发送时,会根据消息标识符进行无损仲裁。
8.2 CAN不是按设备地址发送
CAN报文中的标识符描述的是"这是什么消息",而不是"发给哪台设备"。例如:
-
ID 0x101:电机转速
-
ID 0x102:电机温度
-
ID 0x201:控制指令
8.3 差分信号与显性、隐性
-
显性位:逻辑0
-
隐性位:逻辑1
显性0可以覆盖隐性1,这个"线与"特性使多个节点能一边发送一边监听总线,并完成仲裁。
8.4 无损仲裁过程
CAN标识符数值越小,优先级越高。多个节点同时发送时,发送隐性位的节点检测到总线为显性,就会退出竞争,优先级高的节点继续发送。
8.5 CAN为什么可靠
CAN控制器内置了完善的错误处理机制:
-
CRC校验
-
ACK应答
-
位监测
-
位填充检查
-
帧格式检查
-
出错后自动重发
-
故障隔离状态
8.6 经典CAN与CAN FD
| 对比项 | 经典CAN | CAN FD |
|---|---|---|
| 单帧最大数据 | 8 Byte | 64 Byte |
| 数据阶段速率 | 与仲裁段相同 | 可切换到更高速率 |
九、六种通信方式横向对比
9.1 核心能力对比
| 对比项 | UART | RS232 | RS485 | I²C | SPI | CAN |
|---|---|---|---|---|---|---|
| 是否有时钟线 | 否 | 否 | 否 | 是 | 是 | 否 |
| 信号方式 | 单端 | 正负电压单端 | 差分 | 开漏单端 | 推挽单端 | 差分 |
| 双工方式 | 全双工 | 全双工 | 半双工 | 半双工 | 全双工 | 半双工 |
| 多节点能力 | 无 | 点对点 | 支持 | 支持 | 多从机 | 多主机 |
| 抗干扰能力 | 较弱 | 一般 | 强 | 较弱 | 较弱 | 强 |
| 典型距离 | 板内 | 短距离 | 数百米 | PCB板内 | PCB板内 | 数十至数百米 |
9.2 典型应用场景
| 场景 | 推荐通信方式 | 主要原因 |
|---|---|---|
| 打印STM32调试日志 | UART转USB | 简单、电脑端工具多 |
| 连接传统仪器 | RS232 | 设备接口兼容 |
| 工厂连接多个仪表 | RS485 + Modbus RTU | 距离远、抗干扰、多节点 |
| 连接温湿度传感器、RTC | I²C | 两根线可挂多个低速器件 |
| 连接Flash、ADC、显示屏 | SPI | 速度高、开销小 |
| 汽车节点或高可靠控制网络 | CAN | 仲裁、校验、重发和故障隔离完善 |
十、选型快速判断指南
按以下顺序思考:
-
是不是同一块PCB?
是 → 优先考虑UART、I²C或SPI
-
引脚是否紧张、设备是否较慢?
是 → 优先I²C
-
是否需要高速连续传输?
是 → 优先SPI
-
只是两个设备简单通信或打印日志?
是 → 使用UART
-
需要连接标准RS232仪器?
是 → 使用UART + RS232收发器
-
距离较远、节点较多、成本敏感?
是 → 考虑RS485 + Modbus RTU
-
要求多主机、实时仲裁和强错误处理?
是 → 选择CAN
一句话速记
板内低速少引脚用I²C,板内高速用SPI,简单调试用UART;传统设备用RS232,远距离多节点用RS485,高可靠实时网络用CAN。
希望这篇文章能帮助你建立起对嵌入式通信协议的完整认识。在实际项目中,选择合适的通信方式往往需要在速度、距离、成本和可靠性之间做出权衡。理解每种协议的本质特点,才能在设计时做出最优选择。