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),但功耗极低、手机直连方便,适合小固件或参数包。
数据链路设计的三个关键决策
第一是分包粒度。固件不是一次传完的,必须切成带序号和校验的帧。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 为本地恢复通道,这样即使网络配置错误,现场仍能通过串口救回设备。
链路参数示例:以 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 的每一步都可观察、可重试、可恢复。