吃透 12种嵌入式通信协议,项目选型不用愁
本文整理自公众号 深度Linux 原创文章,作者:往事敬秋风
在嵌入式行业多年,我见过不少项目因通信协议选型失误受阻。此前参与智能照明项目,为压缩成本、降低开发量选用 Zigbee,该协议低功耗、支持自组网,理论适配多节点智能家居。落地测试后弊端接连显现,灯具组网数量上升便频发丢包,周边 WiFi 极易干扰无线信号,加之传输速率有限,多灯同步上报数据时延时突出,无法满足实时操控需求,项目进度受阻,由此认清协议选型对嵌入式项目的关键作用。
各类通信协议构成嵌入式设备的数据传输链路,选型优劣直接决定项目稳定性,选错极易造成成本增加、性能不达标,严重时项目搁置。目前嵌入式主流通信协议多达十二种,参数与适用环境各不相同,下文逐一梳理各协议特性与落地场景,方便开发人员结合项目需求合理挑选通信方案。
Ⅰ、板级通信协议(3 种)
1.1 I²C:简洁高效的双线舞者
I²C(Inter-Integrated Circuit),由飞利浦公司开发,是一种同步、串行、半双工的双线制通信协议,在嵌入式领域中有着广泛的应用。
物理层: 只需两根线——SCL(时钟线)和 SDA(数据线),采用开漏输出方式,需要接上拉电阻(常见 4.7kΩ),电平标准通常为 3.3V 或 5V。设备分为主设备和从设备,每个从设备有唯一的 7 位或 10 位地址。
数据传输流程: SCL 为高电平时 SDA 从高跳低(起始信号)→ 主设备发送 7 位地址 + 1 位读写位 → 每 8 位数据后接收方应答(ACK/NACK)→ SCL 为高电平时 SDA 从低跳高(停止条件)。
MCU 通过 I²C 读取传感器数据:
// 主机发送起始信号I2C_Start();// 发送从机地址 + 写命令I2C_SendByte(SENSOR_ADDR | 0);I2C_WaitAck();// 发送寄存器地址I2C_SendByte(REG_TEMP);I2C_WaitAck();// 重启信号I2C_Start();// 发送从机地址 + 读命令I2C_SendByte(SENSOR_ADDR | 1);I2C_WaitAck();// 读取数据temp = I2C_ReadByte();I2C_SendNack();I2C_Stop();特性: 标准模式 100kbps,快速模式 400kbps,高速模式可达 3.4Mbps。引脚少、布线简单、支持多主控和时钟同步。局限:速度较慢、距离 < 1m、地址冲突需人工管理。
典型应用: 温湿度传感器(SHT30)、气压传感器(BMP280)、EEPROM、RTC 模块、OLED 显示屏。
1.2 SPI:高速全双工的串行先锋
SPI(Serial Peripheral Interface),由摩托罗拉公司开发,是一种高速、全双工、同步的串行通信协议。
物理层: 通常需要四根线——SCLK(时钟线,由主设备产生)、MOSI(主出从入)、MISO(主入从出)、SS/CS(片选,低电平有效)。
特性: 时钟频率可达几十 MHz 甚至上百 MHz;全双工通信;协议简洁,无握手信号;主设备可方便地选择从设备。局限:需要更多引脚、无错误检测机制、通信距离短。
SPI 读取 Flash 芯片 ID:
// 片选拉低,选中设备HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);// 发送读取 ID 指令SPI_SendByte(0x90);// 发送 24 位地址SPI_SendByte(0x00);SPI_SendByte(0x00);SPI_SendByte(0x00);// 读取数据id = SPI_ReceiveByte();// 片选拉高,结束通信HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);典型应用: NOR Flash(W25Q128)、加速度计、陀螺仪、TFT 彩屏、电机驱动器。
1.3 UART:灵活异步的串行纽带
UART(Universal Asynchronous Receiver/Transmitter),是一种异步串行通信协议。
物理层: 只需 TX(发送线)和 RX(接收线)两根线 + GND。没有时钟线,通信双方必须事先约定波特率(典型值 9600bps、115200bps)。
数据帧格式: 起始位(逻辑 0)→ 数据位(5-8 位,先低位后高位)→ 校验位(可选)→ 停止位(1/1.5/2 位高电平)。
UART 收发示例:
// 发送单个字符void UART_SendByte(uint8_t ch) { while(!(UART->SR & 0x80)); UART->DR = ch;}// 接收单个字符uint8_t UART_ReceiveByte(void) { while(!(UART->SR & 0x20)); return UART->DR;}// 主流程:发送字符串并回显UART_SendString("Hello UART\r\n");data = UART_ReceiveByte();UART_SendByte(data);特性: 实现简单、几乎全 MCU 都支持、全双工。局限:点对点通信、依赖波特率同步、速度较慢。
典型应用: 串口调试日志、GPS 模块、蓝牙/WiFi 模块、单片机间通信。
Ⅱ、总线通信协议(4 种)
2.1 CAN:工业与汽车领域的抗干扰强者
CAN(Controller Area Network),由德国博世公司开发,广泛应用于工业自动化和汽车电子领域。
物理层: 差分信号传输(CAN_H 和 CAN_L),双绞线,总线两端需接 120Ω 终端电阻。
数据帧结构: SOF(1位)→ 仲裁场(11/29位 ID)→ 控制场(6位)→ 数据场(0-8字节)→ CRC场(15位)→ 应答场(2位)→ EOF(7位)。
CAN 标准帧发送示例:
CAN_TxHeaderTypeDef tx_header;uint8_t send_buf[4] = {0x11, 0x22, 0x33, 0x44};
tx_header.StdId = 0x123;tx_header.IDE = CAN_ID_STD;tx_header.RTR = CAN_RTR_DATA;tx_header.DLC = 4;
HAL_CAN_AddTxMessage(&hcan1, CAN_TXMAILBOX_0, &tx_header, send_buf);特性: 多主通信、非破坏性总线仲裁、强大的错误检测(5 种检测方法 + 错误计数器)、速率最高 1Mbps、距离最远 10km、支持多达 110 个节点。
典型应用: 汽车 ECU 网络(发动机、ABS、ESP、车身控制)、工业自动化(PLC、DCS)。
2.2 LIN:低成本低速的局部小能手
LIN(Local Interconnect Network),基于 UART/SCI 的低成本串行通信协议。
特性: 单线传输(12V)、速率 ≤ 20kbps、最多 16 个节点、单主多从结构。相比 CAN 总线,硬件成本降低 40%-60%。
LIN 主机发送帧头:
void LIN_SendHeader(uint8_t pid){ LIN_SendBreak(); // 发送同步间隔 UART_SendData(0x55); // 同步字段 UART_SendData(pid); // PID 字段}典型应用: 车窗升降、座椅调节、灯光控制、雨刷系统、小家电控制面板。
2.3 RS485:远距离组网的可靠伙伴
RS485 是一种常用的串行通信物理层标准。
物理层: 差分信号传输(A/B 两线),半双工。通信距离最远 1200m,速率最高 10Mbps,一条总线最多 32 个设备(不使用中继器)。
RS485 半双工发送:
void RS485_Send(uint8_t *buf, uint16_t len){ HAL_GPIO_WritePin(DE_PORT, DE_PIN, GPIO_PIN_SET); for(uint16_t i = 0; i < len; i++) { UART_SendByte(buf[i]); } HAL_GPIO_WritePin(DE_PORT, DE_PIN, GPIO_PIN_RESET);}特性: 抗噪声干扰强、传输距离远、速度快、成本低。
典型应用: PLC 与传感器/执行器通信、楼宇自动化(门禁、照明、空调)、安防监控。
2.4 Modbus:工业设备的通用翻译官
Modbus 是工业自动化领域经典的应用层通信协议。
架构: 主从式,主设备发起请求,从设备(地址 1-247)响应。有 Modbus RTU(基于 RS-485,二进制编码)和 Modbus TCP(基于以太网)两种变种。
Modbus-RTU 读寄存器:
// 读取 1 号从机,起始地址 0 的 2 个保持寄存器uint8_t modbus_req[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0x84, 0x0B};RS485_Send(modbus_req, sizeof(modbus_req));特性: 简单易懂、开放免费、部署成本低、良好的互操作性。局限:缺乏安全性、单主设备瓶颈、数据模型简单(仅 4 种数据类型)。
典型应用: PLC、DCS、传感器、驱动器、SCADA 系统、电力监控。
Ⅲ、无线通信协议(5 种)
3.1 蓝牙:短距离设备的无线桥梁
蓝牙基于 BLE(Bluetooth Low Energy)技术,工作在全球通用的 2.4GHz ISM 频段,采用跳频技术在 79 个信道上快速跳变。通信距离一般 10m,增强后可达 100m。
BLE 从机特征值数据上报:
void BLE_SendNotify(uint16_t handle, uint8_t *data, uint16_t len){ atts_write_req(handle, data, len);}// 调用示例:上报温度 25℃、湿度 50%uint8_t buf[2] = {25, 50};BLE_SendNotify(CHAR_HANDLE, buf, sizeof(buf));典型应用: 无线耳机、智能手环/手表、智能门锁、智能灯泡。
3.2 Wi-Fi:无处不在的无线宽带
Wi-Fi 基于 IEEE 802.11 系列标准,使用 2.4GHz 或 5GHz 频段。速率从 802.11b(11Mbps)到 Wi-Fi 6(9.6Gbps)。
ESP8266 Wi-Fi 连接:
esp_err_t Wifi_Connect(const char *ssid, const char *pwd){ wifi_sta_config_t cfg = {.ssid = ssid, .password = pwd}; esp_wifi_set_config(WIFI_IF_STA, &cfg); esp_wifi_start(); return ESP_OK;}典型应用: 智能电视、智能音箱、智能摄像头、移动设备上网。
3.3 ZigBee:低功耗组网的智能之选
ZigBee 基于 IEEE 802.15.4 标准,使用 2.4GHz/915MHz/868MHz 频段。支持星型、树型和网状网络拓扑。
ZigBee 终端节点上报数据:
void ZB_SendData(uint16_t dst_addr, uint8_t *dat, uint8_t len){ afAddrType_t dst; dst.addr.shortAddr = dst_addr; dst.addrMode = afAddr16Bit; AF_DataRequest(&dst, ENDPOINT, CLUSTER_ID, len, dat, NULL, 0, AF_ACK_REQUEST);}特性: 极低功耗(电池供电)、成本低、自组织和自愈能力强、AES-128 加密。
典型应用: 智能家居(家电控制、照明、安防)、工业监控。
3.4 LoRa:远距离低功耗的通信之星
LoRa(Long Range Radio)使用扩频调制技术,工作频率 433/868/915MHz。通信距离:城镇 2-5km,郊区可达 15km。
LoRa 模块发送数据:
void LoRa_Send(uint8_t *buf, uint8_t len){ LORA_SetFreq(433000000); // 设置 433MHz 工作频点 LORA_SetSF(12); // 扩频因子 12,提升通信距离 SX126x_SendPacket(buf, len);}典型应用: 智能抄表(电表/水表/燃气表)、环境监测、精准农业。
3.5 MQTT:物联网通信的轻量使者
MQTT(Message Queuing Telemetry Transport)基于 TCP/IP,采用发布/订阅模式,最小传输开销仅 1 字节固定报头 + 可选 2 字节心跳。支持三种 QoS 等级(0: 最多一次 / 1: 至少一次 / 2: 恰好一次)。
MQTT 发布数据:
void MQTT_PublishData(char *topic, uint8_t *payload, uint16_t len){ mqtt_client_publish(&mqtt_client, topic, payload, len, MQTT_QOS_1);}典型应用: 物联网传感器数据上传、远程设备控制、智能家居、车联网。
Ⅳ、如何选择合适的嵌入式通信协议?
在项目开发中,需结合五大核心维度综合选择:
1. 通信距离: 板级芯片间选 SPI/I²C;几十米至上千米选 RS-485/CAN;广域监测选 LoRa/NB-IoT。
2. 数据速率: 小数据量低频选 UART/BLE/ZigBee;音频选经典蓝牙;视频/大文件选 Wi-Fi/以太网。
3. 实时性: 工业控制/自动驾驶选 CAN/CAN FD(硬件仲裁 + 异常重传);民用设备(灯具、插座)选 ZigBee/Thread 即可。
4. 数据量: 间断小数据包选 MQTT/CoAP(报文精简、功耗低);大数据流选 TCP/IP/WebSocket。
5. 通信模式: 点对点选 UART;主从选 SPI/I²C;多主选 CAN;自组网选 ZigBee/Thread。
Ⅴ、通信协议实战案例分析
5.1 智能家居项目
智能家居系统包含温湿度传感器、智能灯具、智能插座、中控设备及远程控制模块:
- 传感器 ↔ 主控: I²C 协议,两根线节省管脚,低速率满足传感器需求
- 灯具/插座 ↔ 中控: ZigBee 组网(全屋批量接入)或 Wi-Fi(快速数据交互)
- 远程控制: Wi-Fi + 云端服务器,通过手机 APP 远程控制
// ESP8266 通过 MQTT 上报灯具状态至云端MQTT_Publish("home/light/status", "ON", 2, MQTT_QOS1);5.2 工业自动化项目
大型工厂自动化生产线,包含传感器、执行器、控制器和上位机:
- 传感器 ↔ 控制器: RS485 + Modbus-RTU,差分信号抗干扰,距离上千米
- 机器人协同控制: CAN 协议,多主仲裁确保关键数据优先传输
// Modbus-RTU 读寄存器请求帧,读取 1 号从机压力数据uint8_t modbus_cmd[] = {0x01, 0x03, 0x00, 0x01, 0x00, 0x01, 0x84, 0x0A};RS485_Send(modbus_cmd, sizeof(modbus_cmd));5.3 医疗设备项目
智能医疗监护系统由心电监护仪、血压监测仪、血氧饱和度监测仪等组成:
- 心电监护仪: 以太网(百兆/千兆速率,确保实时性)
- 血压/血氧监测仪: RS485(低成本)或 CAN(高可靠性)
// CAN 发送血氧采集数据至监护主机CAN_TxHeaderTypeDef tx_cfg;uint8_t oxy_data[2] = {98, 97};tx_cfg.StdId = 0x201;tx_cfg.DLC = 2;HAL_CAN_AddTxMessage(&hcan, CAN_TXMAILBOX_0, &tx_cfg, oxy_data);附录:协议速查对比表
| 协议 | 类型 | 速率 | 通信距离 | 功耗 | 典型应用 |
|---|---|---|---|---|---|
| I²C | 有线板级 | 100kbps-3.4Mbps | <1m | 低 | 传感器、EEPROM、OLED |
| SPI | 有线板级 | 可达100MHz | <1m | 低 | Flash、屏幕、加速度计 |
| UART | 有线板级 | 300bps-921kbps | <5m | 低 | 调试日志、GPS、蓝牙模块 |
| CAN | 有线总线 | 最高1Mbps | 10km | 低 | 汽车、工业控制 |
| LIN | 有线总线 | ≤20kbps | <40m | 低 | 车窗、座椅、灯光 |
| RS485 | 有线总线 | 最高10Mbps | 1.2km | 低 | 工业自动化、楼宇控制 |
| Modbus | 应用层 | 取决于底层 | 取决于底层 | 低 | PLC、DCS、SCADA |
| 蓝牙 | 无线 | 1-3Mbps | 10-100m | 低 | 耳机、手环、智能锁 |
| Wi-Fi | 无线 | 11Mbps-9.6Gbps | 50-100m | 中高 | 智能家居、视频监控 |
| ZigBee | 无线 | 20-250kbps | 10-100m | 极低 | 智能家居、工业监控 |
| LoRa | 无线 | 0.3-50kbps | 2-15km | 极低 | 智能抄表、农业、环境监测 |
| MQTT | 应用层 | 取决于底层 | 取决于底层 | 极低 | 物联网、远程控制 |
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!







