嵌入式通信协议全解:UART、RS232、RS485、I²C、SPI 与 CAN 的本质区别与选型指南

目录

前言

一、整体认识:它们不在同一个层次

二、理解通信协议前的五个关键词

[2.1 串行与并行](#2.1 串行与并行)

[2.2 同步与异步](#2.2 同步与异步)

[2.3 单端与差分](#2.3 单端与差分)

[2.4 单工、半双工与全双工](#2.4 单工、半双工与全双工)

[2.5 波特率与比特率](#2.5 波特率与比特率)

三、UART串口

[3.1 一句话理解](#3.1 一句话理解)

[3.2 基本接线](#3.2 基本接线)

[3.3 UART数据帧](#3.3 UART数据帧)

[3.4 优点与局限](#3.4 优点与局限)

[3.5 初学者易错点](#3.5 初学者易错点)

四、RS232

[4.1 一句话理解](#4.1 一句话理解)

[4.2 为什么不能直接连接MCU](#4.2 为什么不能直接连接MCU)

[4.3 通信方式](#4.3 通信方式)

[4.4 优点与局限](#4.4 优点与局限)

[4.5 初学者易错点](#4.5 初学者易错点)

五、RS485

[5.1 一句话理解](#5.1 一句话理解)

[5.2 差分传输为什么抗干扰](#5.2 差分传输为什么抗干扰)

[5.3 两线半双工通信](#5.3 两线半双工通信)

[5.4 终端、拓扑和协议](#5.4 终端、拓扑和协议)

[5.5 优点与局限](#5.5 优点与局限)

六、I²C(IIC)

[6.1 一句话理解](#6.1 一句话理解)

[6.2 两根信号线](#6.2 两根信号线)

[6.3 起始与停止条件](#6.3 起始与停止条件)

[6.4 一次写寄存器的过程](#6.4 一次写寄存器的过程)

[6.5 地址和速度](#6.5 地址和速度)

[6.6 优点与局限](#6.6 优点与局限)

七、SPI

[7.1 一句话理解](#7.1 一句话理解)

[7.2 四类信号](#7.2 四类信号)

[7.3 SPI为什么能全双工](#7.3 SPI为什么能全双工)

[7.4 四种SPI模式](#7.4 四种SPI模式)

[7.5 优点与局限](#7.5 优点与局限)

八、CAN

[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 初学者易错点

  1. 两个设备的TX不能接TX,应该TX接RX

  2. 两端的波特率、数据位、校验位和停止位必须一致

  3. 3.3V MCU不一定能承受5V UART信号

  4. 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 初学者易错点

  1. DB9接口不代表一定是RS232

  2. 不能把RS232电平直接接入STM32引脚

  3. 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 仲裁、校验、重发和故障隔离完善

十、选型快速判断指南

按以下顺序思考:

  1. 是不是同一块PCB?

    是 → 优先考虑UART、I²C或SPI

  2. 引脚是否紧张、设备是否较慢?

    是 → 优先I²C

  3. 是否需要高速连续传输?

    是 → 优先SPI

  4. 只是两个设备简单通信或打印日志?

    是 → 使用UART

  5. 需要连接标准RS232仪器?

    是 → 使用UART + RS232收发器

  6. 距离较远、节点较多、成本敏感?

    是 → 考虑RS485 + Modbus RTU

  7. 要求多主机、实时仲裁和强错误处理?

    是 → 选择CAN


一句话速记

板内低速少引脚用I²C,板内高速用SPI,简单调试用UART;传统设备用RS232,远距离多节点用RS485,高可靠实时网络用CAN。


希望这篇文章能帮助你建立起对嵌入式通信协议的完整认识。在实际项目中,选择合适的通信方式往往需要在速度、距离、成本和可靠性之间做出权衡。理解每种协议的本质特点,才能在设计时做出最优选择。

相关推荐
熊猫钓鱼>_>1 小时前
从“串数据“焦虑到 Space 自由,我用 Agent Bucket 智能体桶管游戏素材
开发语言·人工智能·游戏·agent·bucket·workbuddy·space
heimeiyingwang2 小时前
【架构实战】Kubernetes网络模型深度解析:从Pod通信到Ingress网关实战
开发语言·架构·php
luj_17682 小时前
变频技术核心原理揭秘
服务器·c语言·开发语言·经验分享·算法
_Narcissus_2 小时前
B树概念及操作笔记(含完整代码实现)
c语言·数据结构·数据库·c++·笔记·b树·算法
君顾13 小时前
智慧场馆解决方案小程序系统开发实战指南
java·开发语言·智慧场馆
Fa_Mian_Tuan3 小时前
图论基础 | 邻接多重表原理剖析 + 完整可运行C语言代码(插边/删边/释放)
c语言·数据结构·笔记·算法·图论
运维行者_3 小时前
预测性云监控怎么做?AI驱动的7大核心能力与落地路径
服务器·开发语言·网络·数据库·人工智能·python·php
_Narcissus_3 小时前
B+树的概念和操作笔记(含完整代码实现)
c语言·数据结构·数据库·c++·笔记·b树·算法
名字还没想好☜4 小时前
Next.js Route Handler 做 SSE 服务端推送:实时进度条、自动重连与什么时候别用 WebSocket
开发语言·javascript·websocket·react·sse·next.js