4. 通信接口选型与升级通道

OTA 升级的第一步不是写 Flash,而是把固件字节从“远端”搬到 STM32 的接收缓冲区。这条搬运路径由通信接口决定,而接口一旦选错,后面再精巧的 Bootloader 也救不回来。本节不讨论协议栈细节,而是聚焦一个工程判断:在给定产品形态、现场条件和固件体积下,UART、CAN、以太网、Wi-Fi、BLE 各自适合承担 OTA 的哪一段链路,以及数据链路该如何设计。

先看五个接口的“物理性格”

选型的本质是匹配约束。UART 是点对点异步串行,接线最少、驱动最简单,STM32 侧通常用 USART 加 DMA 接收,但速率受限于线长与时钟误差,常见 115200 bps 到 921600 bps,且没有链路层重传,必须靠上层协议补可靠性。CAN 是差分总线,天然多节点、带仲裁与 CRC,适合车载和工业现场,但经典 CAN 单帧仅 8 字节数据,升级时必须做分包与流控,速率常见 500 kbps 或 1 Mbps。以太网提供 10/100 Mbps 甚至千兆,配合 LwIP 和 TFTP/HTTP 可跑大固件,但需要 PHY、MAC 和网络配置,成本与功耗最高。Wi-Fi 带宽高、部署灵活,适合消费类设备,但连接建立慢、功耗大、信号受环境影响。BLE 速率最低(实际吞吐常在几十到几百 kbps),但功耗极低、手机直连方便,适合小固件或参数包。

STM32 OTA 五类升级通道数据链路对比 接口 典型速率 链路层可靠性 STM32 侧关键外设 适用固件规模 典型场景 UART 115200~921600 bps 无,需上层重传 USART + DMA + IDLE ≤ 256 KB 调试口/网关 点对点 线长 ≤ 3 m CRC16 + 序号 双缓冲接收 分片 1 KB 成本最低 CAN 500 kbps / 1 Mbps CRC + 自动重传 bxCAN / FDCAN ≤ 512 KB 车载/工业 多节点总线 差分抗扰 ISO-TP 分包 FIFO + 过滤器 块大小 4~8 帧 UDS 0x34/0x36 以太网 10/100 Mbps TCP 重传 ETH + PHY + LwIP ≥ 1 MB 网关/工控 有线稳定 需变压器 HTTP/TFTP 零拷贝 pbuf 分片 1.4 KB 远程批量 Wi-Fi 1~50 Mbps 实际 TCP 重传 SDIO/SPI + 模组 ≥ 512 KB 智能家居 无线灵活 受信号影响 MQTT/HTTP AT 或透传 分片 1~2 KB 功耗较高 BLE 20~200 kbps L2CAP 重传 UART/SPI + 模组 ≤ 128 KB 穿戴/医疗 手机直连 功耗最低 GATT 分片 MTU 协商 分片 244 B 小包/参数

数据链路设计的三个关键决策

第一是分包粒度。固件不是一次传完的,必须切成带序号和校验的帧。UART 上常用 1 KB 分片,帧头包含 magic、总包数、当前序号、payload 长度和 CRC16;CAN 上受 8 字节限制,通常用 ISO-TP 或自定义块传输,每块 4~8 帧后等待接收方确认;以太网和 Wi-Fi 走 TCP 时,应用层分片可以放大到 1~2 KB,因为 TCP 已保证字节流有序可靠,但应用层仍需整体 CRC 校验,防止传输过程中被截断或篡改。BLE 的 ATT MTU 协商后有效载荷通常 244 字节,分片必须更细,且要处理写请求的流控。

第二是流控与重传。UART 没有硬件流控时,接收方必须用软件 ACK 控制发送节奏,否则 DMA 缓冲区溢出会丢字节。CAN 的自动重传能解决单帧丢失,但整块丢失仍需上层块确认。以太网和 Wi-Fi 依赖 TCP 重传,应用层只需处理超时和会话恢复。BLE 的 GATT 写操作有响应机制,但连续写需要控制发送窗口,避免模组缓冲区溢出。

第三是升级通道与业务通道的复用。很多产品只有一个物理接口,OTA 数据必须和正常业务数据共用同一条链路。此时需要设计通道复用策略:UART 上可以用帧类型字段区分业务帧和升级帧;CAN 上用不同 CAN ID 区分;以太网上用不同 TCP 端口或 HTTP 路径区分;Wi-Fi 和 BLE 则通过不同服务或特征值区分。复用设计的关键是升级期间业务不能完全中断,或者至少能安全暂停并恢复。

一个可落地的选型判断流程

面对具体项目,可以按以下顺序判断:先看固件体积,超过 512 KB 优先考虑以太网或 Wi-Fi;再看现场布线条件,有网线且设备固定选以太网,无线且供电充足选 Wi-Fi;车载或强干扰工业环境选 CAN;只有调试口或低成本网关选 UART;穿戴、医疗等低功耗小固件场景选 BLE。如果产品同时具备多个接口,可以设计主备通道:以太网为主,UART 为本地恢复通道,这样即使网络配置错误,现场仍能通过串口救回设备。

选型时不要只看理论速率。UART 标称 921600 bps,但加上帧头、ACK 等待和 Flash 写入时间,实际有效吞吐可能只有 40~60 KB/s。CAN 在 500 kbps 下,考虑仲裁和帧间隔,有效载荷吞吐通常只有 200~300 kbps。评估升级时间时,必须用有效吞吐而不是标称速率。

链路参数示例:以 256 KB 固件、UART 115200 bps 为例

假设固件 256 KB,UART 配置 115200-8-N-1,每字节 10 位,理论线速率 11.52 KB/s。每帧 1 KB 数据加 16 字节帧头,共 1040 字节,传输时间约 90 ms。每帧后等待 ACK 约 5 ms,Flash 写入 1 KB 约 10 ms(按页写入估算),则每帧实际耗时约 105 ms,256 帧共约 26.9 秒。若把分片改为 2 KB,帧头占比下降,但接收缓冲区需要 2 KB 以上,且单帧出错重传代价翻倍。工程上常在 1~2 KB 之间折中。这个计算说明:UART 升级 256 KB 固件在几十秒量级,适合对升级时间不敏感的场景;若要求 10 秒内完成,就必须换以太网或 Wi-Fi。

数据链路设计检查清单

  • 帧格式是否包含 magic、版本、总包数、序号、长度、CRC?
  • 接收缓冲区是否用 DMA + IDLE 中断或双缓冲,避免丢字节?
  • 是否有块确认或逐帧 ACK,超时时间是否大于最坏传输时间?
  • 升级通道与业务通道如何区分,升级期间业务是否安全暂停?
  • 断点续传是否支持,设备重启后能否从已写入偏移继续?
  • 整体固件 CRC 或签名是否在写入完成后校验,失败是否回滚?

通信接口选型没有绝对最优,只有与产品约束最匹配。把固件体积、现场条件、功耗预算和升级时间要求列清楚,再对照上表中的速率、可靠性和外设开销,就能快速缩小范围。链路设计则要抓住分包、流控、复用和校验四个抓手,确保字节从远端到 Flash 的每一步都可观察、可重试、可恢复。