很多人第一次接触嵌入式通信,是从“串口”开始的:装一个CH340串口驱动,打开串口调试助手,选好COM口和波特率,发一个AT,收到OK,就觉得离硬件很近了。但从串口能收发字节,到设备真正变成一个物联网节点,中间其实隔了很远。物理层用什么电平,链路上怎么寻址,多节点怎么避免冲突,数据怎么上云,每一层都有对应的通信协议在起作用。
这篇内容就是把从板级到物联网最常用的10种通信协议放在一起对比,重点讲清楚各自的优缺点、传输距离、应用场景,以及我实际调板子和部署项目时踩过的坑。适合正在做毕业设计、准备把传感器产品推向市场,或者刚接手一个物联网项目、不知道该怎么选通信方式的工程师。通信协议没有绝对的好坏,只有合不合适。
1. 先理清:串口和物联网之间隔了哪几层
1.1 UART只负责搬字节,别把电平混为一谈
UART串口通信定义的只是字节怎么异步传输,包括起始位、数据位、停止位、波特率,它对“这个字节代表什么”完全不关心。我们常说的TTL串口、RS-232串口、RS-485串口,本质上都是UART在不同物理层上的实现。
这点特别容易踩坑。很多人看到设备上写着“串口”,就直接把两个模块的TX、RX交叉接在一起,结果发现要么没数据,要么乱码。原因往往是电平标准不一样:TTL电平用3.3V或5V表示逻辑1,RS-232用负电平表示逻辑1,两者不能直接互连,中间必须加电平转换芯片。UART只是“传输管道”,管道两头是什么电压标准,决定了你能连多远、抗不抗干扰。
1.2 从点对点到IP网络,中间要解决四件事
物联网设备通信,本质上要解决四件事:第一,数据怎么到达目标节点;第二,节点之间怎么区分彼此;第三,数据出错怎么办;第四,设备功耗和成本能不能接受。
UART天然就是点对点,一条线上只能有一个发送方和一个接收方,没有寻址能力。RS-485和CAN解决了多点共线和寻址问题;以太网和Wi-Fi把设备变成了IP节点,可以直接上云;BLE和Zigbee解决了无线免布线组网;LoRa和NB-IoT则把覆盖范围拉到几公里甚至十几公里。
所以“从串口到物联网”这条线,本质上是从物理信道走向应用层生态的过程。你在选型时先想清楚:目前卡在哪一层,问题是用距离、节点数、速率还是功耗来定义的。
1.3 距离只是起点,误码率和实时性决定成败
只看“传输距离”选型是最容易翻车的。RS-485在9600波特率下能传1200米,但如果现场不接终端电阻,波形反射会让整个总线隔三差五丢帧;Wi-Fi在客厅里可能很稳,但到了金属货架密集的仓库,信号衰减和反射会让你怀疑人生。
通信选型不是查一张距离表就能定下来的,还要看误码率、实时性、抗干扰能力和维护成本。距离只是第一个筛子,筛完之后还得用数据量和功耗这两个筛子再过一轮。
2. 板级通信三兄弟:UART、I2C、SPI 的短距离局
2.1 UART:从串口调试助手起步,也要记得3.3V和5V的坑
UART的典型传输距离很短,TTL电平下一般不要超过1米,而且这个距离还是理论值,实际线材差一点就乱码。如果改成RS-232电平,能到15米左右;想再远,就得加RS-485收发器,这时候物理层已经不是UART了。
速率上,常规应用以9600bps到115200bps居多,工业上也有用更高波特率的,但波特率越高,对线路质量和收发器要求也越高。UART的最大优点是简单通用,几乎每颗MCU都有UART外设,调试信息、AT指令、传感器数据上报,全都可以靠它搞定。缺点也非常明显:点对点、无确认机制,你发一个字节过去,对方收没收到、收到的对不对,UART自己不知道。
我在项目里接各种传感器模组时,最常见的坑不是协议解析,而是电平。很多GPS模块、指纹模块是3.3V逻辑,但有些老设备是5V逻辑,不转换就往MCU引脚上怼,运气好能工作,运气不好直接烧引脚。所以现在拿到一块新板子,第一件事先用万用表量电平,再拿逻辑分析仪抓波形,确认波特率、数据位、停止位没问题,最后才去写解析代码。
2.2 I2C:两根线的便利与上拉电阻的烦恼
I2C只靠SDA和SCL两根线就能挂一堆设备,每个设备有独立地址,MCU通过地址来访问,不需要额外的片选引脚。标准模式100kbps,快速模式400kbps,高速模式3.4Mbps,对传感器、EEPROM、RTC这类小数据量设备来说完全够用。
但I2C有它的命门,就是线距和总线电容。I2C通常用于同一个PCB、同一块小板上,超过几十厘米就开始不稳定。上拉电阻选不好,总线电平爬不上去,数据就全是错的。上拉电阻太小,灌电流过大;上拉电阻太大,上升沿太慢。常规做法是先按总线上设备和线缆长度估计电容,再从1kΩ到10kΩ之间试,4.7kΩ是很多板卡的默认值。
实际项目里,一台设备挂8个传感器的情况很常见,这时总线电容会明显变大。我的做法是尽量分组,比如两个I2C总线分别跑不同传感器,或者用I2C多路复用器(比如TCA9548A)做通道隔离。很多人调I2C一直收不到ACK,最后发现根本不是地址问题,而是SDA和SCL接反了,或者上拉电阻没焊。
2.3 SPI:高速全双工,但别指望它可以跑长线
SPI是板级通信里速度最快的方案之一,常见1MHz到40MHz,全双工,靠SCLK、MOSI、MISO和CS四根线工作。每多一个从设备,就要多占一个CS引脚。SPI没有标准寻址机制,靠片选区分设备,好处是协议开销低,适合SD卡、Flash、LCD、高速ADC这些需要连续搬运大量数据的场景。
SPI的短板是距离。板内走线没问题,一旦用排线拉到二三十厘米以上,信号完整性就麻烦了,速率越高反射越明显,时钟和数据相位一乱,读出来的全是错数据。更麻烦的是SPI没有统一的应用层协议,芯片手册说Mode 0,实际可能必须用Mode 3,很多工程师卡在SPI上不是信号问题,而是CPOL和CPHA没配对。
我的调试习惯是先把SPI时钟降到1MHz,用逻辑分析仪抓SCLK、MOSI、MISO和CS之间的关系,确认设备确实按照预期返回数据后,再逐步提高速率。直接上来就跑20MHz,出了问题根本分不清是时序配置、接线长度还是供电纹波导致的。
3. 工业现场的长跑:RS-485 与 CAN 的距离密码
3.1 RS-485:差分信号、Modbus RTU与1200米
RS-485用A/B两根差分线传输信号,靠两根线之间的电压差来判断逻辑1和0,所以共模干扰被大幅抵消,抗干扰能力远好于单端UART。标准规定在较低速率下通信距离可达1200米,但注意,速率越高,最大距离越短。真正让RS-485在工业领域扎根的,是Modbus RTU这个应用层协议。
Modbus RTU的典型拓扑是一主多从:一条RS-485总线上挂多个从站,每个从站有地址,主站轮询。以读取寄存器为例,请求帧可以简单表示为:
01 03 00 00 00 01 84 0A其中01是从站地址,03是功能码(读保持寄存器),00 00是起始寄存器地址,00 01是读取数量,84 0A是CRC16校验。从站返回的数据里也带CRC,主站校验失败就丢弃这条报文。
优点很明确:多点、抗干扰、技术成熟,制造、电力、楼宇自动化里到处都是RS-485。缺点也不难理解:半双工,同一时刻只能有一方发送;没有标准的“RS-485应用协议”,大家通常自己约定,而Modbus能火就是因为它是事实标准。实际项目里,A/B接反、终端电阻不匹配、总线分支过长,是三大高频故障点。RS-485布线最好采用菊花链,总线两端各接一个120Ω终端电阻,不要从中间引一根长线出来当作分支。
3.2 CAN:用报文仲裁解决多主实时控制
CAN总线同样是差分传输(CAN_H和CAN_L),但和RS-485最大的区别在于它有一套完整的报文仲裁和错误处理机制。多个节点同时抢总线时,ID小的报文自动优先,硬件层面直接仲裁,不需要主站统一调度。
CAN的另一个强项是错误处理。节点检测到错误会发送错误帧,连续错误过多的节点会自动进入Bus Off状态,从总线上隔离,不会影响其他节点继续通信。这种特性让CAN非常适合汽车、BMS、机器人、医疗器械这类对可靠性要求极高的场景。
距离和速率的权衡同样存在:1Mbps时通信距离大约只有40米,降到125kbps时可以到500米左右。关键在于所有节点的波特率必须一致,否则根本无法同步。调试CAN光靠万用表是不够的,最好备一个USB-CAN分析仪,看错误帧类型、总线负载率和各节点报文。
我们有一次设备上多块板卡通信,最开始用UART轮询,主控要一个一个问,响应慢了就把实时控制卡住了。后来改成CAN总线500kbps,每块板卡按优先级用不同ID主动上报,主控只处理仲裁后的结果,实时性立刻上来了。
3.3 一张小表看懂RS-485和CAN的取舍
| 对比项 | RS-485 | CAN |
|---|---|---|
| 传输介质 | 双绞线A/B | 双绞线CAN_H/CAN_L |
| 通信方式 | 半双工,一主多从 | 多主,广播,硬件仲裁 |
| 典型速率 | 9600bps ~ 115200bps | 125kbps ~ 1Mbps(CAN FD更高) |
| 最大距离 | 1200米(低速) | 约40米@1Mbps,低速时几百米 |
| 错误处理 | 依赖上层协议(如Modbus CRC) | 硬件CRC+错误帧+自动重发+Bus Off |
| 应用场景 | 工业仪表、电表、楼宇自控 | 汽车、BMS、机器人和实时控制 |
选RS-485还是CAN,关键看需求。只是采集温度、湿度、电量数据,Modbus RTU足够;要做多个控制器之间的实时联动、节点主动上报,CAN更合适。
4. 设备怎么变成IP节点:以太网与Wi-Fi的分工
4.1 以太网:稳定与供电的代价
以太网的速率、可靠性和生态成熟度都不用多说,10/100/1000Mbps对大多数传感器来说已经过剩。它的真正价值在于确定性:延时可控,丢包可控,故障排查手段丰富,而且PoE供电可以让一根网线同时搞定数据和电源。
但以太网也有明显代价:功耗和成本。一个以太网PHY本身就要消耗几百毫瓦甚至更高,再加上网络变压器、RJ45接口、屏蔽线,成本比RS-485高不少。所以让每个末端传感器都拉网线往往不现实,更合理的架构是设备侧用RS-485或CAN组成总线,再用一个网关把总线数据转成以太网上云。这也是很多边缘计算节点在工厂或园区设备数据上云时的常见做法。
4.2 Wi-Fi:方便,但功耗和掉线问题不能回避
ESP8266和ESP32把Wi-Fi模块成本拉到很低,让Wi-Fi成了消费级物联网的事实标配。直接连路由器,走TCP或MQTT上云,开发效率确实高。但Wi-Fi模块的瞬时电流不容小视,连接时需要几十到几百毫安,发射瞬间电流尖峰很大。电池供电设备如果没做好休眠-唤醒策略,几周就没电了。
实际项目里,Wi-Fi设备频繁掉线不一定是信号问题,供电不足是非常常见的原因。模块发射瞬间电流一大,劣质电源电压跌落,射频就失锁掉线。我的习惯是给Wi-Fi模块单独加低ESR大电容,必要时用独立LDO供电,规避这类问题。另一个高频问题是路由器把“长期无流量”的设备踢下线,所以Wi-Fi设备要能识别网络中断,定期重新连接,并且在上层做重连和补传机制。
Wi-Fi距离在室内也就30到100米,穿两堵墙后信号质量下降非常明显。如果是大批量设备部署,2.4GHz频段的拥挤和路由器带机量都会成为瓶颈。很多做智能家居的同学以为给所有插座都上Wi-Fi就完事了,结果一个家用路由器挂了二三十个设备,掉线、延迟、互相干扰,最后只能再补一个Wi-Fi网关集群,工程复杂度直线上升。
4.3 应用层协议同样重要:MQTT和TCP的取舍
设备上了以太网或Wi-Fi之后,应用层协议也必须提前想清楚。是按固定时间用HTTP上报,还是维持一条TCP长连接,还是走MQTT发布订阅机制?
MQTT在物联网场景里更常用,因为它有QoS等级、遗嘱消息和主题订阅机制。但要注意,MQTT的“可靠”不是绝对的:QoS 0会丢消息;QoS 1保证至少一次,可能重复;QoS 2最严格但成本最高。实际设备上报和数据下发,都需要自己设计去重、缓存和补传逻辑,不能天真地以为用了MQTT就万事大吉。
5. 短距离免布线的蓝牙与Zigbee:低功耗和自组网的取舍
5.1 BLE:手机直连很香,但吞吐量有限
BLE最大的优势有两个:一是低功耗,一颗纽扣电池能撑很久;二是手机直连,几乎每台智能手机都支持BLE,不需要额外网关。BLE 4.x的点对点距离通常在10到50米,BLE 5.0空旷环境下可以到几百米,但这是以降低速率或增加编码开销为代价的。
BLE的吞吐量很有限。空中速率虽然有1Mbps或2Mbps,实际有效吞吐量通常只有几十KB/s,这是由连接间隔、包长和协议开销共同决定的。如果你想通过BLE往手机实时传大量传感器原始数据,一定会被狠狠地教育一顿。我们在做可穿戴设备时,把滤波和特征提取算法放到设备端,手机只接收处理结果和少量曲线,数据量一下子降下来了。
BLE还有个经典坑:默认MTU只有23字节,不协商MTU到247字节之前,一次应用数据传输非常有限,很多新手在Android和iOS上调试时发现同样的代码,两边表现完全不一样,多半就是MTU协商差异导致的。
5.2 Zigbee:Mesh自愈和生态门槛是一体两面
Zigbee基于802.15.4标准,空中速率250kbps,单跳距离通常10到100米,但通过Mesh组网可以覆盖整个住宅或办公楼。Zigbee最大的价值是低功耗和自愈网络:某个节点掉线,数据会自动绕行其他节点;协调器负责建立网络,路由器负责扩展覆盖,终端设备可以非常省电。
但它不是没有代价。Zigbee设备必须通过协调器入网,用户用起来不如BLE方便;不同品牌的互操作性依赖ZCL规范,如果厂商加了私有扩展,生态就封闭了。实际调试中,Zigbee入网时经常出现“设备只亮灯不入网”的情况,这时候要先确认协调器和设备是否在同一信道,再去检查设备是否已经处于允许入网模式。没有抓包工具,Zigbee排障会非常痛苦。
5.3 2.4GHz频段的拥挤现状与干扰对策
Wi-Fi、BLE、Zigbee大多默认工作在2.4GHz频段,而微波炉、无线鼠标、蓝牙耳机也全挤在这一带,电磁环境相当拥挤。Zigbee信道和Wi-Fi信道还会重叠,部署时要专门做信道规划。单独测试每一台设备都正常,等所有设备同时开机,突然就乱套,这种现象在智能家居和办公场景里太常见了。
我的经验是:能用有线解决的高带宽场景,不要硬上无线;无线场景里,关键控制链路要做重传,实时数据要设置超时和告警。2.4GHz这个频段不是不能干活,而是要认清它的拥挤现实,提前留出余量。
6. 远距离低功耗:LoRa的物联网价值,以及NB-IoT怎么选
6.1 LoRa:用低速率换覆盖,适合自建网络
LoRa用线性调频扩频技术,灵敏度很高,加上Sub-GHz频段的绕射能力,在城市里能覆盖1到5公里,郊区或农村可以达到5到15公里。它在免授权频段工作(国内常见470-510MHz),企业可以自建网关,不依赖运营商。
LoRa的速率非常低,从0.3kbps到50kbps左右,而且速率越低,覆盖越远。对农业、园区、资产追踪这类场景来说,节点大部分时间休眠,每小时上报一次几百字节的温湿度、液位或定位数据,LoRa绰绰有余。
实际部署中,网关位置、天线高度、扩频因子(SF)规划都很关键。SF数值越大,灵敏度越高、覆盖越远,但空中占用时间越长,网关容量越低。同一个网关下不建议混用太多不同的SF和带宽参数,否则会产生严重的容量浪费。低功耗也不是平白来的,节点必须敢于休眠,同时要考虑服务器下发命令时会受到休眠周期限制,允许的最大通信时延决定了下行策略。
6.2 NB-IoT:蜂窝级可靠,但受制于运营商
NB-IoT是在授权频段上工作的蜂窝物联网方案,覆盖好、接入认证和安全管理成熟,适合水表、电表、地磁车位检测这类设备。它需要SIM卡、需要资费、依赖运营商网络,设备调试和运维都不如LoRa自主。
NB-IoT的上行速率一般也只有几十kbps,数据量同样不适合视频或音频。它真正的强项是公网广覆盖,只要基站信号到了,设备就能注册入网,安全性由政府级网络和SIM认证机制兜底。选型时,LoRa更像“自己建私有网”,NB-IoT更像“租用公网管道”。如果项目覆盖范围跨城市、跨省,NB-IoT更省心;如果就在一个园区、一个农场里,LoRa成本更低、可控性更强。
6.3 “低功耗”的前提是要敢休眠、会休眠
LoRa和NB-IoT省电的核心都靠休眠。一个常见误区是节点每隔几秒就上报一次,结果一个“低功耗设备”半年就没电了。正确做法是拉长上报周期,用外部中断或定时唤醒,平时所有外设都关掉。
同时也要想清楚“下行控制”的代价:设备休眠越深,服务器想控制设备就越难。产品规格书里如果写了“远程实时控制”,那就得留一个下行监听窗口,或者在协议里设计“唤醒后再查询命令”的机制。低功耗不是一个硬件指标,而是一种系统设计策略。
7. 十大协议强对比:一张表解决选型第一问
7.1 全协议参数表
| 协议 | 典型距离 | 典型速率 | 优点摘要 | 缺点摘要 | 典型场景 |
|---|---|---|---|---|---|
| UART(TTL) | 1米以内 | 9600bps ~ 1Mbps | 简单通用,MCU标配 | 点对点、无校验、距离短 | 传感器模组、调试口、AT指令 |
| I2C | 同一块PCB,几十厘米 | 100kbps ~ 3.4Mbps | 两根线挂多设备、地址寻址 | 总线电容受限、速率低 | 传感器、EEPROM、RTC |
| SPI | 同一块PCB,最好20厘米内 | 1Mbps ~ 40Mbps+ | 高速全双工、协议开销低 | 接线多、无标准协议、长线难 | Flash、SD卡、LCD、高速ADC |
| RS-485 | 1200米(低速) | 9600bps ~ 115200bps | 多点、抗干扰、工程成熟 | 半双工、需Modbus等应用层 | 工业仪表、Modbus RTU、电表 |
| CAN | 40米@1Mbps,低速几百米 | 125kbps ~ 1Mbps | 多主、仲裁、故障容错强 | 配置复杂、需专业工具调试 | 汽车、BMS、机器人、实时控制 |
| 以太网 | 100米 | 10/100/1000Mbps | 高带宽、稳定、PoE供电 | 功耗高、成本高、线缆要求高 | 网关、PLC、摄像头、边缘计算 |
| Wi-Fi | 室内30~100米 | 实际10Mbps以上 | 高带宽、易上云、生态成熟 | 功耗高、干扰大、配网复杂 | 智能家居、视频监控、消费电子 |
| BLE | 10~100米 | 空中1~2Mbps,实际几十KB/s | 低功耗、手机直连 | 吞吐量低、上下行不均衡 | 可穿戴设备、Beacon、智能门锁 |
| Zigbee | 单跳10~100米,Mesh扩大 | 250kbps | 低功耗、Mesh自愈、节点容量大 | 需网关、生态门槛高、互操作有风险 | 全屋智能、灯光、传感器 |
| LoRa | 城市1~5公里,郊区5~15公里 | 0.3kbps ~ 50kbps | 远距离、低功耗、可自建网关 | 速率极低、占空比受限 | 农业、园区、资产追踪、智慧城市 |
这里把LoRa列入第十个,NB-IoT算是对位的蜂窝方案,和LoRa有很强互补性。如果你不需要自建网关,也可以把NB-IoT放到同一张表里比较,它距离远、可靠性高,但要付运营商费用。
7.2 常见混淆概念梳理
把概念分清,能避免很多“选错协议”的尴尬。
- Modbus不是物理层,它是应用层协议,既可以通过RS-485跑,也可以通过TCP/IP跑。RS-485是管道,Modbus是一套“频道里的对话规则”。
- MQTT也不是物理层,它是物联网消息协议,跑在TCP/IP之上,通常跑在Wi-Fi或以太网设备上。
- UART是一种串行通信机制,RS-232、RS-485、TTL是它的电平实现。不要把它们当成互相竞争的方案,它们经常一起出现。
- Zigbee、BLE、Wi-Fi都工作在2.4GHz附近,但网络拓扑和功耗定位完全不同,需要根据项目需求选。
8. 我的选型心法:先算三笔账,再决定用谁
8.1 第一笔账:距离、节点和拓扑
先明确物理范围。十米以内、节点少的场景,UART、I2C、SPI足够;一百米以内的室内或园区,Wi-Fi、BLE、Zigbee是主流;几百米到几公里,优先RS-485布线,或者LoRa/NB-IoT上无线。节点数量大,优先选带寻址能力的协议,比如RS-485、CAN、Zigbee,不要用一堆UART点对点硬拼。
8.2 第二笔账:数据量、时延和可靠性
传输视频,直接选Wi-Fi或以太网;实时控制电机,CAN比串口要靠谱得多;温湿度每小时上报一次,LoRa或者Zigbee绰绰有余;高吞吐传感器数据,在设备内部用SPI搬运,对外只上报处理结果。通信距离再远,带宽不够,方案也会直接报废。
8.3 第三笔账:供电、成本和维护
电池供电加远距离,LoRa或NB-IoT;电池供电加近距加手机连接,BLE;产品通电后对功耗不敏感,Wi-Fi或以太网更方便;单价敏感、现场环境恶劣,RS-485加Modbus可能是最稳妥的选择。
还要考虑长期维护成本。RS-485接线错误容易排查,无线配网问题却可能让用户崩溃;LoRa网关一旦故障,会影响一个片区,需要冗余或备件策略;Wi-Fi设备数量多了,路由器选型也变成了系统设计的一部分。
8.4 我的个人体会
做项目这些年,我越来越觉得通信协议不是越先进越好,“能用、能维护、能省钱”才是关键。我曾经在一个设备上把所有节点都设计成Wi-Fi采集,结果到了现场发现金属货架把信号挡得七零八落,最后老老实实改成分支RS-485采集、区域网关汇总再走以太网上云,问题立刻解决了。从那以后,我习惯在设计早期先画一张通信拓扑图,标清哪一段是板内、哪一段是现场总线、哪一段是云端接入,然后再去选每一段的协议。很多折腾,其实在图纸阶段就已经可以避免。