嵌入式通信协议全解: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。


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

相关推荐
落魄实习生5 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai
茉莉玫瑰花茶6 小时前
GO [ 方法 ]
开发语言·后端·golang
狗凯之家源码网6 小时前
微博图床 PHP 系统搭建与实战应用指南
android·开发语言·php
乌暮8 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习
2601_962218618 小时前
C语言中三种库的编译和使用方法
开发语言·c++
铅笔小新z8 小时前
【C语言】操作符
c语言
传奇开心果编程8 小时前
中庸、有容、破执:仓颉编程语言的中华智慧结晶——三重哲学境界思辨
开发语言·华为·开源·软件工程
jimy18 小时前
派生类重写基类虚函数(二):override的作用
开发语言·c++
_upupup9 小时前
异常(C++)
java·开发语言·jvm
霸道流氓气质9 小时前
ComfyUI 图像生成工作流完全指南:从节点编排到Java生产级图像生产实战
java·开发语言·人工智能