嵌入式工程师和面试党最头疼的事情之一,就是通信协议太多:UART、SPI、I2C、CAN、Modbus、USB、Ethernet、Wi-Fi、BLE、ZigBee……每个都能聊两句,但真要放到项目里选型,或者被面试官追问“现场总线段为什么不用 SPI”,就开始含糊。
这次我们不按“协议列表挨个念”的方式讲,而是直接给一套判断链路:先从应用场景出发,把 12 种常见嵌入式通信协议分成板级、工业级、系统级、无线级四类,再讲每种协议的帧结构、接线方式、适用位置和实际调试要点。最后附带一套通用抓包/测试流程,以及嵌入式面试中高频出现的对比题回答框架。
这篇文章适合三类读者:刚学 STM32/Arduino、想把通信连接讲清楚的新手;正在做板级选型但被硬件方案反复打回的老工程师;准备嵌入式面试、需要一套不背书也能自圆其说的回答逻辑的同学。建议先收藏,然后把下文的“验证流程”和“排查表”复制到自己的笔记里。
1. 嵌入式通信协议全景速览
先把结论放在最前面。嵌入式项目中最常出现的 12 种通信协议,可以按物理距离和传输目的分成四层:
| 分类 | 典型协议 | 一句话职责 | 典型位置 |
|---|---|---|---|
| 板级/芯片间 | UART | 点对点异步收发,调试和模块通信 | MCU 与串口屏、GPS、蓝牙模块 |
| 板级/芯片间 | I2C | 双线多设备总线,地址寻址 | MCU 与 EEPROM、温湿度传感器、OLED |
| 板级/高速 | SPI | 同步全双工,速率高,片选区分 | MCU 与 Flash、SD 卡、高速 ADC |
| 板级/单总线 | 1-Wire | 一根线既能供电又能传数据 | DS18B20 温度传感器、单总线器件 |
| 工业现场总线 | RS232/RS485 | 把 TTL 串口变成远距离差分信号 | 工控机/PLC/仪表之间的串口通信 |
| 工业现场总线 | CAN | 多主、短帧、抗干扰,带优先级仲裁 | 汽车、BMS、工业现场控制 |
| 工业应用协议 | Modbus | 基于主从问询的应用层协议 | PLC、传感器、网关设备 |
| 系统级高速接口 | USB | 主机枚举外设,协议层次复杂 | 上位机、U 盘、图像采集、烧录器 |
| 系统级联网 | Ethernet | 接入 IP 网络,跑 TCP/IP 协议栈 | 嵌入式 Linux、高端 MCU 网关 |
| 无线局域网 | Wi-Fi | 连接路由器/手机/云平台 | ESP8266/ESP32、物联网网关 |
| 无线短距离 | BLE | 低功耗、手机互联、广播/连接 | 手环、传感器、找设备、Mesh |
| 无线传感器网 | ZigBee | 大规模低功耗自组网 | 智能家居、工业传感采集 |
这里的分类不是绝对的,例如 RS485 底层是差分异步串口,Modbus 可以运行在 RS485 上,也可以跑在 TCP 上。不要把它们当成互斥选项,重点是知道每个协议在物理层、数据链路层、应用层分别承担什么角色。
更直接的理解方式是:协议不是背下来的,是在“距离、速率、确定性、拓扑结构”四个因素之间取舍出来的。
2. 从四个维度看穿任何通信协议
2.1 距离:板内、板间、工业线缆还是无线
板内通信距离一般也就是几厘米到几十厘米,所以 UART、SPI、I2C、1-Wire 这类电平协议很流行。一旦信号要走出 PCB,比如从传感器板传到主机箱,线长超过几十厘米,就必须考虑电平标准、线缆阻抗、共地干扰,这时候 RS232/RS485/CAN 会比 TTL UART 更合理。
无线协议的“距离”更加复杂。Wi-Fi 在室内穿墙能力一般,BLE 典型覆盖一个房间范围,ZigBee 单节点距离也不远,但通过 Mesh 组网能覆盖更大区域。选型时要区分“单跳距离”和“网络覆盖范围”。
2.2 速率:你到底要传多少数据
- 调试日志、配置指令:几十 bit/s 都可能够,UART 很合适。
- 传感器周期性上报:几百字节每秒,I2C/Modbus 都很轻松。
- 高速数据采集、摄像头、音频流:需要 SPI 甚至并行、USB、以太网。
- 无线场景中 Wi-Fi 是吞吐量最高的,BLE 适合低速率低频次,ZigBee 速率更低但功耗和组网结构更优。
2.3 确定性:实时控制能不能容忍数据碰撞重发
CAN 和工业以太网的最大优点之一,是消息有优先级、冲突通过仲裁机制处理,不会像普通 TCP/IP 网络那样出现明显不确定的延迟。如果用来做电机控制、安全联锁这类实时性强的系统,普通串口软件轮询方式不太可靠,需要重点考虑 CAN、EtherCAT 或其它工业总线方案。
2.4 拓扑和成本:要接几个设备,能布几根线
- I2C 一条总线理论上可以挂多个地址设备,跑起来只需要两根线。
- SPI 用片选信号,每增加一个从设备通常就要占用一个 CS 引脚。
- RS485 和 CAN 都支持多节点总线结构,但终端电阻、地址分配、故障隔离要求不同。
- USB 是树状主从结构,嵌入式设备通常作为 Device 或者 OTG 设备。
把项目需求先写成一张表:数据量多大、有几个节点、线缆多长、是否需要断电续传、上位机形态是什么,然后对照上表,基本能筛掉一大半选项。
3. 板级常用协议:UART、I2C、SPI、1-Wire
3.1 UART:异步串口,嵌入式调试的命脉
UART 的传输原理是:把并行数据变成串行比特流,收发双方提前约定波特率,不需要时钟线。典型连接是 TX 接对方 RX、RX 接对方 TX、地线必须共地。关键点在于“异步”:收发双方依靠波特率约定对齐每位时间,因此波特率偏差和晶振误差会直接导致乱码。
使用 STM32 HAL 库时,常规发送代码如下:
uint8_t tx_buf[] = "UART OK\r\n"; HAL_UART_Transmit(&huart1, tx_buf, sizeof(tx_buf), 100);接收方面,尤其是接收不定长数据,强烈建议不要在主循环里反复阻塞等待单字节。更好的方案是采用空闲中断 + DMA,或者为每条消息增加帧头、长度、校验字段。工程上最常见的错误包括:RX/TX 接反、只接 TX/RX 没共地、波特率设置不一致、接收缓冲区没有环形队列导致丢包。
UART 的“变体”很多:TTL UART 直接输出 3.3V/5V 电平;RS232 用正负电压表示逻辑电平,适合早期 PC 串口;RS485 用差分电压传输,抗干扰强,跑得更远。从软件协议层看,AT 指令、GPS NMEA 0183、PM2.5 传感器输出等大量模块,基本都是 UART 承载文本/字节流,所以任何嵌入式平台都值得把 UART 调试基础设施做好。
3.2 I2C:两根线挂多个设备
I2C 使用 SCL 时钟线和 SDA 数据线,属于半双工同步通信。总线上的每个从设备都有设备地址,主机发起起始条件后先发送从机地址和读写位,再进行数据收发。I2C 必须接上拉电阻,常见值为 1kΩ 到 10kΩ,取决于总线速率和负载电容。如果没有上拉电阻,总线上会一直出现低电平或波形畸形,设备无法应答。
典型读取传感器寄存器流程:
uint8_t reg_addr = 0x00; uint8_t buf[2]; HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)(sensor_addr << 1), ®_addr, 1, 100); HAL_I2C_Master_Receive(&hi2c1, (uint16_t)(sensor_addr << 1), buf, 2, 100);调试 I2C 时最容易踩的坑有三个:地址的 7 位/8 位表示法混用;漏接上拉电阻或上拉电压不对;多个设备地址冲突后总线被拉死。实际测量时用逻辑分析仪看 SCL/SDA 波形,几乎能立刻发现问题。
3.3 SPI:速度优先的同步全双工接口
SPI 的原理比 I2C 直观:主机提供 SCK 时钟,主机输出 MOSI,从机输出 MISO,通过 CS 片选信号选中某个从设备。全双工、无协议头、时序简单。缺点是每个从设备都要占用一根 CS,而且没有强制的应答机制,从机异常时主机可能完全不知道。
SPI 常用于 Flash、TF 卡、显示驱动、高速 ADC/DAC、CAN 控制器、以太网控制器等芯片。一部分传感器的 SPI 最大时钟超过 10MHz,实测能跑到多少,与 PCB 走线长度、电平转换器、从设备规格都有关系。初次调试时先把时钟降到 1MHz 验证波形,再逐步提高,是很稳妥的习惯。如果 MISO 一直为高或为低,要优先检查 CS 时序,特别是连续读取时 CS 是否在整个传输期间保持拉低。
3.4 1-Wire:单根数据线的低成本方案
1-Wire 最具代表性的设备是 DS18B20 温度传感器,一颗芯片只需要一个 IO 口,既能供电又能传数据。1-Wire 对时序特别敏感:初始化、写 0/写 1、读时隙都有严格的微秒级时间要求,用 GPIO 模拟时要关中断,否则容易超时。主机通过总线上的唯一 ROM 序列号识别多个设备,但在实际拉线较长时,寄生供电和线缆长度会限制挂载设备数量。
在不需要高速、不追求复杂拓扑的场景里,1-Wire 很省引脚;但需要周期性批量读取很多传感器时,它逐位读时序的“慢”就会成为瓶颈。所以往往只在小批量测温、电池包检温这类对速率不敏感的场景使用。
4. 工业级协议:RS485、CAN、Modbus
4.1 RS232/RS485:把串口搬到更长更远的距离
RS232 是早期计算机串口标准,12V 电平,适合点对点,传输距离有限,现代嵌入式主板上越来越少。RS485 则把信号变成 A/B 两线差分,能跑更远、支持多点总线,抗共模干扰更强,是工业控制里使用极广的物理层方案。
RS485 通常是半双工,发送和接收共用一对差分线,所以软件里必须控制方向引脚。在 STM32 中常通过一个 GPIO 切换 DE/RE 方向:
RS485_DIR_EN(); // 置为发送模式 HAL_UART_Transmit(&huart2, data, len, 100); RS485_DIR_DIS(); // 切回接收模式很多人把 RS485 和“Modbus 协议”混为一谈,其实 RS485 是物理层,Modbus RTU 是应用层协议,Modbus 可以跑在 RS485、RS232、TCP 等多种通道上。RS485 总线的首尾两端需要接 120Ω 终端电阻,节点地线不能完全悬空,否则长线通信时容易出现乱码或偶然丢包。
4.2 CAN:天生能抗争仲裁的车规级总线
CAN 总线多用于汽车、BMS、工业现场。和 UART/RS485 不同,CAN 的数据通过 CAN_H 和 CAN_L 两线差分传输,使用显性/隐性电平实现总线访问,多个节点可以同时发送,发送时通过 ID 优先级进行仲裁。因此 CAN 自带多主通信能力,不需要主机一个一个轮询。
经典 CAN 2.0 的最大波特率通常为 1 Mbit/s,实际项目中根据总线长度和收发器选择,常见为 125 kbit/s、250 kbit/s、500 kbit/s。使用 STM32F103/CAN 外设时,需要根据波特率计算位时间参数,比较繁琐。高版本 HAL 库可以用如下方式初始化基础参数:
CAN_FilterTypeDef can_filter = {0}; can_filter.FilterIdHigh = 0; can_filter.FilterIdLow = 0; can_filter.FilterMaskIdHigh = 0; can_filter.FilterMaskIdLow = 0; can_filter.FilterMode = CAN_FILTERMODE_IDMASK; can_filter.FilterScale = CAN_FILTERSCALE_32BIT; can_filter.FilterActivation = ENABLE; can_filter.SlaveStartBank = 0; HAL_CAN_ConfigFilter(&hcan, &can_filter); HAL_CAN_Start(&hcan); HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);真实项目里,CAN 报文不超过 8 字节负载,因此每个“事件”需要拆成多条报文来发。它的价值在于:总线短帧、错误检测、仲裁重发机制成熟,能够保证消息在相对确定的时间内完成传输,所以比“主机发指令、从机慢慢返回”的轮询式通信更适合实时控制。
4.3 Modbus:工业上位机最常见的应用层语言
Modbus 是事实上的工业通信“普通话”。Modbus RTU 报文包括地址、功能码、数据区、CRC 校验;Modbus TCP 则把 Modbus 报文封装到 TCP 数据里,方便和上位机、边缘网关通信。PLC 通常直接支持 Modbus 主从模式,传感器、电机驱动器、网关设备也都经常带 Modbus 接口。
Modbus 调试需要关心的核心点不是底层怎么收发,而是寄存器地址映射和功能码。比如要保持寄存器地址、线圈地址、输入寄存器地址在协议文档中与代码一致,否则上位机读到的是错误位置的数据。CRC 校验必须严格实现,很多串口帧错位问题都是 CRC 计算或字节序不一致造成的。
5. 系统级高速接口:USB 与以太网
5.1 USB:既复杂又统一的连接中枢
USB 的优势在于“主从结构清晰”和“即插即用”,上位机不需要关心设备内部寄存器细节,只要设备正确实现了描述符和端点,主机就能枚举成功。但 USB 协议层次复杂:设备描述符、配置描述符、接口描述符、端点描述符、各种类协议(HID、CDC、MSC 等)层层嵌套。很多单片机开发者第一次接触时会被 STM32 USB 库里的回调函数绕晕。
嵌入式设备中常见做法是:
- 使用 CDC 虚拟串口,免驱模拟出一个 COM 口,替代传统 UART 调试;
- 使用 MSC 类,把板载 Flash 变成 U 盘,方便固件升级或导出数据;
- 使用 HID 类,实现免驱、低延迟的人机交互设备;
- 使用自定义 Vendor 类,传输私有格式数据,但需要安装配套驱动。
调 USB 时,优先看主机端是否能正确枚举。如果枚举失败,重点查 VBUS 检测、上拉电阻、晶振频率、DP/DM 布线、描述符长度是否正确。USB 协议抓包需要逻辑分析仪或者专用分析仪,没有设备时,先看设备管理器和 UsbTreeView 等信息,能判断是枚举阶段失败还是数据阶段出错。
5.2 以太网:让嵌入式设备加入 IP 网络
MCU 加以太网 PHY,或者直接跑嵌入式 Linux,就可以让设备接入局域网,通过 TCP/UDP、HTTP、MQTT 等协议与上位机和云平台通信。以太网带来的核心提升不是“物理层速率高”,而是软件生态极其成熟:可以用 lwIP、嵌入式 Linux、各种 SDK,不必自己重造应用层协议。
嵌入式以太网调试最有用的工具是抓包。用 Wireshark 抓包后要会看三层信息:MAC 层是否有 CRC 错误、IP 层是否分片重组异常、TCP 层是否有重传或乱序。局域网通信时,常见故障包括 IP 地址冲突、网关配置错误、网线只通了百兆/千兆的其中两对线、防火墙拦截了特定端口。
6. 无线级协议:Wi-Fi、BLE、ZigBee
6.1 Wi-Fi:接入互联网最省事的无线通道
Wi-Fi 模组常见的方案是 ESP8266/ESP32、W600、以及 Linux 板卡自带 Wi-Fi。嵌入式里用 Wi-Fi 通常有两种姿势:
- 把 Wi-Fi 当成“透明串口”:MCU 通过 UART 向模组发 AT 指令,模组和路由器建立 TCP/UDP 连接;
- 直接在 SoC 上跑 TCP/IP 协议栈:ESP32、嵌入式 Linux 直接运行 HTTP/MQTT 客户端。
Wi-Fi 的问题是功耗高、连接状态不够稳定,特别是在弱信号环境、待机唤醒后很容易出现断线重连慢、重连风暴。工程上应当在固件中加入连接状态管理:记录当前 Wi-Fi 状态、使用指数退避重连、避免在高噪声环境中高频尝试。如果连接路由器再通过云端下发指令,链路里每一环都可能出问题,建议把状态机清晰拆分:Wi-Fi 连接态、TCP 连接态、应用层会话态。
6.2 BLE:低功耗、手机互联最稳的选项
BLE 的定位不是传大文件,而是在低功耗前提下完成小数据量周期性通信。设备以广播或连接两种方式存在:广播用于连接前被发现;连接后通过 GATT 服务和特征值交换数据。MCU 侧常使用 Nordic nRF5 SDK、ESP32 BLE API 或 ST 的 BLE 协议栈。
BLE 选型时要重点确认“自定义服务怎么设计”。建议把所有上报数据都按“特征值”划分,UUID 尽量使用标准蓝牙 SIG 定义或自定义 128 位 UUID,每个特征值配置好读写/通知属性。不要让连接后频繁发送大数据,BLE 的实际有效吞吐率远低于空口速率,尤其在 Android 系统中受 MTU 和连接间隔限制明显。BLE 调试时用 nRF Connect 或 LightBlue 这类手机 App 是最快的手段:能看广播包、扫描结果、服务列表,也能直接写入特征值验证设备端逻辑。
6.3 ZigBee:大规模传感器网络的自组网方案
ZigBee 和其他无线协议最大的区别是协议栈强调低功耗与 Mesh 自组网。它基于 IEEE 802.15.4,速率低,单跳距离有限,但节点可以通过路由中继形成多跳网络,适合智能家居、工业传感等大规模节点场景。ZigBee 产品通常由一个协调器建立网络,其他设备以路由器或终端节点的形式加入。开发中常见的痛点不是单个节点的收发,而是网络建立、节点入网、离网后的路由恢复,以及和 WiFi 共用 2.4G 频段时的干扰问题。
从纯无线选型角度看:
- 要和手机短距离通信:优先 BLE;
- 要接路由器上云、传视频或传输大量日志:优先 Wi-Fi;
- 要自组网挂成百上千个低功耗传感器:优先 ZigBee / Thread / 专有 Mesh;
- 要超低功耗、每天只发几个字节:BLE 或子 1G 专有协议都比 Wi-Fi 合适。
7. 用一套流程验证任意通信协议
很多人遇到新模块时,习惯直接写业务代码,结果一直调不通。下面是一套可以复用的通用验证流程,适用于串口、I2C、SPI、CAN 和无线模组。
7.1 确认硬件连接与电平标准
先看原理图或开发板丝印,确认电源、地、信号线。不同电平标准之间不要直接互连,3.3V 设备接 5V TTL 可能损坏引脚,RS232/RS485/CAN 都需要电平转换芯片或转换器。
7.2 先用简单回环测试
UART 可以直接把 TX 与 RX 短接,自发自收;RS485 可以用 USB 转 485 收发器回环测试;I2C 可以用逻辑分析仪直接看 SCL/SDA 波形;SPI 可以把 MISO 与 MOSI 短接,用假数据回环验证时序。不要一上来就接传感器,因为传感器本身可能故障,会将问题混淆。
7.3 分步抓取原始数据
对 UART/RS485/CAN 这类异步总线,用逻辑分析仪或 CAN 分析仪抓原始波形/报文;对 I2C/SPI,用逻辑分析仪观察协议解码结果。如果能抓到明确的起始位、寄存器地址、ACK/NACK、CRC 校验,就说明物理层和数据链路层已经通了,问题多半在应用层。
7.4 构造最小化交互
不要直接实现完整的需求协议,先发一条固定指令,看是否收到固定响应。例如对于 I2C 传感器,先读设备 ID 寄存器;对于 CAN 电机驱动器,先发一条停止报文;对于 BLE 设备,先用手机 App 连接并读取一个特征值。最小化交互成功之后再逐步增加状态字段和数据长度。
7.5 记录正常数据和异常现场
把正常工作的报文、寄存器访问序列、波特率参数记录到开发笔记。遇到问题时的排查顺序建议是:电源和接线 → 电平 → 时钟/波特率 → 引脚复用 → 帧格式 → 地址/ID → CRC → 应用层逻辑,不要一上来就怀疑协议栈。
8. 面试和工程交流中的回答框架
嵌入式相关的笔试和面试中,几乎必考“不同通信协议对比”。下面给出的不是标准答案,而是能够向面试官展示工程判断力的回答路径。
8.1 I2C 和 SPI 怎么选
先讲差异:
- I2C 用两根线,通过设备地址寻址,支持一主多从,硬件开销小,但速率通常不如 SPI,而且需要上拉电阻,每次通信有协议开销;
- SPI 用 4 根线,常用 CS 片选,全双工,速率可以很高,但每增加一个从设备就多占用一个 CS,没有标准应答机制。
再落到场景:一个成熟产品中,I2C 适合连接地址固定的低速传感器和存储芯片,SPI 适合连接大容量 Flash、TF 卡、屏幕等对吞吐量要求高的设备。能把这句话说清楚,比背“I2C 400k,SPI 10M”更有说服力。
8.2 UART 收到乱码怎么排查
直接按优先级给排查清单:先确认板卡的工作电压和电平标准,再确认波特率、停止位、校验位是否一致,再检查地线是否共地、RX/TX 是否接反;然后用回环测试把链路切成几层,判断是 MCU 内部发送问题、外部线缆干扰还是对端设备配置问题。还可以借助逻辑分析仪看波形,数一下一个字节的实际位宽。
8.3 CAN 总线为什么适合工业控制
从“冲突解决方式”讲:RS485 是半双工总线,如果多个节点同时发送会冲突,只能靠上层协议轮询或退避重发;CAN 使用显性/隐性电平和基于 ID 的仲裁机制,多个节点可以同时访问总线,高优先级报文会赢得仲裁,从而保证确定的发送时机。再补充短帧、错误检测、总线长度和波特率关系,就可以收尾。
8.4 为什么嵌入式设备上常见“UART 转 Wi-Fi”方案
很多低成本设备的主控只有 UART,而 Wi-Fi 模组可以把网络协议栈、TCP/IP、连接管理都独立出去,MCU 只需通过简单 AT 指令或二进制帧格式下发数据。这样做的好处是主控不需要消耗大量资源处理网络协议,缺点是链路层的稳定性、协议兼容性都依赖模组固件,必须做断线重连和应用层确认机制。
9. 常见问题排查对照表
把嵌入式通信里的高频问题整理成一张表,实际调试时可以先快速对照:
| 问题现象 | 可能原因 | 检查方式 | 解决方案 |
|---|---|---|---|
| UART 一直收到乱码 | 波特率不一致、地线没共地、TX/RX 接反 | 回环测试、逻辑分析仪测波形 | 确认波特率、共地、交叉连接 |
| I2C 总线 SDA 一直低 | 总线被某个从机拉死、上拉电阻缺失、地址冲突 | 示波器看 SCL/SDA,去掉从机测试 | 补上拉电阻,逐个排查从机 |
| SPI 读回全 0 或全 FF | CS 时序异常、MISO 信号没拉起、引脚复用错误 | 逻辑分析仪看 CS/SCK/MOSI/MISO | 检查 CS 在整个传输期间保持拉低 |
| 1-Wire 读不到传感器 | GPIO 模式不对、关键时序被打断 | 检查外部中断和多任务抢占 | 时序段关闭中断,延长延时 |
| RS485 首尾设备通信正常,中间节点异常 | 终端电阻位置错误、总线分支过长 | 量 A/B 端电压,观察波形 | 首尾各接一个 120Ω 终端电阻 |
| CAN 收发不正常 | 波特率配置不对、缺少终端电阻、CAN_H/CAN_L 接反 | 用 CAN 分析仪抓报文 | 确认位时间配置,恢复总线接线 |
| Modbus 能回但数据错误 | 寄存器地址映射错误、CRC 字节序不对 | 用 Modbus 调试上位机读寄存器 | 核对从机寄存器表和 CRC 实现 |
| USB 枚举失败 | VBUS 检测/上拉/晶振/描述符异常 | 看设备管理器与 USB 分析工具 | 检查 DP/DM 线路和描述符长度 |
| Wi-Fi 频繁断连 | 电源噪声、固件弱信号重连参数不合理 | 看日志和路由器端信号 | 增加指数退避重连,检查电源 |
| BLE 扫描不到设备 | 广播间隔、广播数据过长、手机缓存 | 使用 nRF Connect 扫描 | 降低广播数据长度,清除手机扫描缓存 |
| ZigBee 节点无法入网 | 协调器容量满、信道拥挤、路由器节点下线 | 检查入网许可时间和网络状态 | 预留入网窗口,调整信道 |
10. 总结与下一步
12 种协议背后真正值得花时间记忆的,其实是四个问题:距离有多远、速度要求多高、实时性是否确定、拓扑能承担几根线。把这四个问题写在需求表上,再做一次选型,多数“协议不知道用哪个”的困惑都能解决。
接下来最值得做的验证动作有两个:
- 用逻辑分析仪抓一组 I2C/SPI 波形,亲手对照协议时序图确认起始条件、地址和数据位,比看十篇科普文都有效;
- 在 MCU 上把 UART 接收改成 DMA + 空闲中断,再对比原来阻塞接收的丢包率,这会让你真正理解“物理层通了不等于应用层可靠”。
最容易踩的坑是只看协议规格、不看硬件条件。波特率再高,线一长、地一杂,照样乱码;协议再优秀,电源纹波大、缺终端电阻,一样不稳定。把本文的排查表打出来放在工位上,新项目从底层验证开始,通信问题会少很多。