简介:本文系统梳理嵌入式开发中12种常用的有线通信协议,覆盖UART、SPI、I2C、CAN、RS-485、Modbus等,逐一解析其定义、工作原理、速率与距离边界及典型应用场景,并给出选型要点、易混淆概念辨析与调试注意事项,帮助开发者在板内互联与工业长距传输之间做出合理决策。
嵌入式通信协议,是嵌入式系统中芯片与芯片、模块与模块、设备与设备之间进行数据交换时共同遵守的一套约定。这套约定通常包含四个层面的内容:
需要说明的是,嵌入式语境下的“协议”是一个宽泛说法。以最常见的UART为例,它严格来说是微控制器上的异步串行收发外设及其通信方式;RS-232、RS-485更偏向电气层标准;Modbus则是构建在串行链路之上的应用层协议。业界习惯将它们统称为“通信协议”,本文遵循这一习惯,并在必要处标明层次差异。
有线通信协议的共同特征是:信号沿物理导线传输,链路稳定、抗干扰能力强、数据基本不丢包。无论是电路板上芯片之间几厘米的数据交互,还是厂区里上千米的信号传递,底层兜底的基本都是有线协议。无线方案胜在部署灵活,但在可靠性与实时性要求严苛的场合,有线仍是首选。
不同场景对通信的需求差异极大:
没有任何一种协议能在所有维度同时占优,于是形成了按场景分工的协议生态。理解每种协议“是什么、强在哪、边界在哪”,是技术选型的前提。
按通信半径从近到远,可分为四组:
UART(通用异步收发传输器)是嵌入式开发者接触频率最高的协议:串口打印调试、日志输出、蓝牙/GPS/4G模块的AT指令控制,底层都依赖它。
它的本质是“异步”串行通信:不使用时钟线同步数据,收发双方事先约定好“语速”——即波特率,然后一位一位地传输。省掉时钟线的好处是接线极简,TX接对方RX、RX接对方TX、共地即可工作;代价是双方时间基准必须足够接近,一旦晶振误差偏大、时钟配置有偏差或线缆引入干扰,采样点就会错位,出现乱码。
UART的一帧数据由以下部分构成:
配置常简写为”115200-8-N-1”,即波特率115200、8位数据、无校验、1位停止位。很多初学者以为115200是铁定标准,实际上晶振误差、主流32位微控制器的时钟树配置、线材长度、旁边的电机干扰,都可能让实际波特率跑偏,这也是调试乱码问题的第一排查点。
UART的硬伤是抗干扰能力弱、仅支持点对点。它的主场是板内调试、日志输出以及与低速模块通信;若拉几十米线穿过工业现场,误码与丢包会非常明显。
此外,学会基础串口中断只是入门,工程实践中真正耗费时间的是:DMA传输、空闲中断、环形缓冲区设计,以及最棘手的“粘包”问题——多次发送的数据在接收端连成一串,无法直接按帧切分。
以下是一段最基础的串口中断接收示意代码,属于“能跑但经不起推敲”的版本:
volatile uint8_t rx_byte;void UART_IRQHandler(void) /* 通用示意代码 */{if (UART_RXNE_FLAG_SET()) {rx_byte = UART_READ_DATA(); /* 读走一个字节 */process_byte(rx_byte); /* 直接在中断里处理 */}}
它的问题在于:中断里做耗时处理会拖慢响应;没有缓冲区,数据到达快于处理速度时会溢出丢数据;没有帧边界判断,粘包无从谈起。工程化的做法通常是“DMA搬运+空闲中断切帧+环形缓冲区缓存”,再交由应用层按协议解析。
SPI(串行外设接口)是典型的同步总线,依靠时钟线SCK同步数据,共四根信号线:时钟SCK、主出从入MOSI、主入从出MISO、片选CS。采用主从架构,一主多从,通过片选线选中目标器件。
由于自带时钟线,SPI不需要约定波特率,速率上限由器件决定,常见可达数十MHz量级,是板内高速外设(Flash存储、显示屏、高速ADC、存储卡)的首选,且支持全双工,吞吐率高。
使用要点:SPI有四种模式(由时钟极性CPOL与时钟相位CPHA组合决定),主从双方必须匹配,否则数据整体错半拍;片选数量随从机数量增加;长距离走线时高频时钟易受反射与干扰影响,一般控制在几十厘米以内。
I2C(集成电路总线)只用两根线:时钟SCL与数据SDA,均为开漏输出、需外接上拉电阻。它通过7位(或10位)地址寻址挂接在总线上的器件,支持一主多从甚至多主,天然适合连接多个低速芯片。
标准模式100kbps、快速模式400kbps,速率不高,但两根线即可挂接多个器件,引脚成本极低,广泛用于传感器、EEPROM、实时时钟等低速外设。
使用要点:上拉电阻阻值影响信号上升沿质量,需根据总线电容调整;器件地址可能冲突,选型时注意地址脚复用;总线异常时可能死锁(从机拉住SDA不释放),通常由主机补发9个时钟脉冲强制释放;半双工且速率低,不适合大吞吐场景。
1-Wire(单总线)只用一根数据线,部分器件还能通过这根线同时取电(寄生供电),配合地线即可完成通信与供电。主机通过微秒级的时隙编码读写位,并通过64位唯一ID寻址器件。
典型应用是数字温度传感器、身份识别与加密芯片等低速率器件。优势是布线极限精简,甚至可构建较长的一线网络;代价是时序要求严格、速率低,通常需要延时精确的驱动配合。
RS-232严格说是电气层标准,帧格式沿用UART。它用±3V~±15V的电压摆幅表示逻辑电平,与常见的3.3V/5V逻辑电平不兼容,需要电平转换芯片。传输距离通常建议15米以内,点对点连接,抗干扰优于裸UART但仍属单端信号。
典型场景是传统工控设备与上位机通信,如今在消费电子中已被USB大面积取代,但仪器与工控领域依然常见。
RS-485同样只规定电气层——采用一对差分线(A/B)传输信号。差分方式天然抵消共模干扰,配合双绞线与终端电阻,传输距离可达上千米,支持多点挂接(通常32个以上节点),半双工。
它是工业现场最常用的物理承载:控制器与传感器、仪表之间大量使用RS-485,上层运行Modbus RTU等应用协议。使用要点:总线两端需匹配终端电阻抑制反射;半双工需要收发方向切换,软件上要处理好“发送转接收”的时序;注意共地与隔离,防止现场地电位差损坏接口。
Modbus是构建在串行链路(RS-232/RS-485)或以太网(Modbus TCP)之上的应用层协议,采用主从问答模式:主机发请求,从机应答,支持读线圈、读寄存器、写寄存器等功能码,数据模型简单透明。
它开放、实现简单、调试工具丰富,是工业设备互操作的事实标准之一。局限在于轮询模式导致实时性与带宽利用率一般,且无内建安全机制,适合在受控网络内使用。
CAN(控制器局域网)为车辆与工业控制设计,差分两线,经典CAN速率可达1Mbps。其核心机制是“无损逐位仲裁”:报文标识符决定优先级,高优先级报文在总线竞争中自动胜出,低优先级报文退让重发,数据不被破坏;配合CRC校验、错误计数与自动重发,可靠性极高。
CAN不按节点地址寻址,而是按报文标识符广播,接收方自行过滤。典型应用是汽车电控网络、电梯、医疗设备与工业自动化。后续演进版本进一步提高了数据场长度与速率,常与经典CAN一并提及。
LIN(局域互联网络)是CAN的低成本补充:单线、基于UART帧格式、主从架构、速率约20kbps,常用于车门、车窗、座椅、后视镜等对实时性要求不高的车身部件。网络由一个主节点按调度表发起通信,从节点应答,结构简单、线束成本低。
USB是消费级设备互联的通用标准,差分信号、支持热插拔与即插即用,协议栈分层完善(端点与控制/批量/中断/同步四类传输),速率覆盖低速至数Gbps。对嵌入式设备而言,USB常以设备模式(虚拟串口、大容量存储、自定义类)接入上位机,或以主机模式读取存储设备与键鼠。复杂度集中在枚举与协议栈实现,多数平台通过通用协议栈完成。
以太网是局域网的事实标准,差分传输、支持全双工与交换组网,速率从10Mbps到数Gbps以上,协议栈向上衔接TCP/IP体系。嵌入式设备通过MAC与PHY接入,常用于工业以太网、网关、视觉与数据汇聚等高带宽场景。成本与协议栈复杂度高于串行类总线,但带宽与组网能力无可替代。
SWD与JTAG严格来说不是数据通信协议,而是芯片调试与编程接口标准,但几乎每个嵌入式开发者都离不开。JTAG使用4~5根线,支持边界扫描与多器件链;SWD精简为两根线(时钟+数据),占用引脚极少。它们承载调试通道、断点控制、闪存烧录等功能。注意:走线过长或干扰会导致下载失败;量产固件应按需关闭调试口以提升安全性。
| 协议 | 线数 | 同步方式 | 双工 | 典型速率 | 典型距离 | 典型场景 |
|---|---|---|---|---|---|---|
| UART | 2 | 异步 | 全双工 | ~115.2kbps | 板内/数米 | 调试、低速模块 |
| SPI | 4+片选 | 同步 | 全双工 | 数十MHz | 板内 | Flash、屏、ADC |
| I2C | 2 | 同步 | 半双工 | 100k~400kbps | 板内 | 传感器、EEPROM |
| 1-Wire | 1 | 异步 | 半双工 | 低位速率 | 可较长 | 温度、ID芯片 |
| RS-232 | 含地约3 | 异步 | 全双工 | ~115.2kbps | ≤15米 | 设备级点对点 |
| RS-485 | 2 | 异步 | 半双工 | 数Mbps级 | 约上千米 | 工业现场 |
| Modbus | — | 应用层 | 主从问答 | 取决承载 | 取决承载 | 工业互操作 |
| CAN | 2 | 异步 | 半双工 | ~1Mbps | 短距@高速 | 车载、工控 |
| LIN | 1 | 异步 | 半双工 | ~20kbps | ~40米 | 车身低优先级 |
| USB | 4 | 同步 | — | Mbps~Gbps | 数米 | 外设互联 |
| Ethernet | 4 | 同步 | 全双工 | 10M~Gbps+ | 约100米/跳 | 网络骨干 |
| SWD | 2 | 同步 | 半双工 | 调试速率 | 板级 | 调试烧录 |
几组容易混淆的概念:
嵌入式有线通信协议是设备间数据交换的底层底座,核心价值在于“稳定、抗干扰、不丢包”。12种常用协议各司其职:UART负责调试与低速交互,SPI/I2C/1-Wire负责板内外设互联,RS-232/USB负责设备级连接,RS-485/Modbus/CAN/LIN负责工业与车载现场,以太网承担高速骨干,SWD/JTAG支撑调试与烧录。选型的本质,是在引脚成本、速率、距离、可靠性、组网能力与实现复杂度之间做权衡——理解每种协议的定义与能力边界,比记住任何单项参数都更重要。