✳相遇
导航

吃透 12种嵌入式通信协议,项目选型不用愁

3038 字
15 分钟
吃透 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有线总线最高1Mbps10km低汽车、工业控制
LIN有线总线≤20kbps<40m低车窗、座椅、灯光
RS485有线总线最高10Mbps1.2km低工业自动化、楼宇控制
Modbus应用层取决于底层取决于底层低PLC、DCS、SCADA
蓝牙无线1-3Mbps10-100m低耳机、手环、智能锁
Wi-Fi无线11Mbps-9.6Gbps50-100m中高智能家居、视频监控
ZigBee无线20-250kbps10-100m极低智能家居、工业监控
LoRa无线0.3-50kbps2-15km极低智能抄表、农业、环境监测
MQTT应用层取决于底层取决于底层极低物联网、远程控制

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

吃透 12种嵌入式通信协议,项目选型不用愁
https://blog.xuefei.art/posts/embedded-comm-protocols/
作者
雪飞
发布于
2026-07-17
许可协议
CC BY-NC-SA 4.0

文章目录