XMODEM-1K 协议流程梳理

0 阅读2分钟

Xmodem-1K 是 XMODEM 协议的一个高效扩展版本,主要用于串行通信中的可靠文件传输。后续将用于自己的BootLoader中。

协议背景与目的

核心设计目标:在高误码率、低带宽的串行链路上,实现简单而可靠的数据传输。

原始版本Xmodem使用 128 字节数据块 + 1 字节校验和,效率较低。协议逻辑简单,代码量小;点对点的半双工通信;数据被分为固定大小的“块”进行传输;错误校验;等待式ARQ。

Xmodem-1K :数据块大小提升至 1024 字节(1KB);支持 CRC-16 校验(更可靠的错误检测);使用不同起始字符以区分协议版本。

数据包结构

每个数据包的格式如下(共1029字节)

字段长度说明
起始字符1 字节STX(0x02) —— 区别于标准XMODEM 的 SOH(0x01)
包序号1 字节从 1 开始递增,模 256 循环
包序号反码1 字节序号按位取反
数据1024 字节实际传输内容;若不足 1024 字节,末尾用 0x1A(SUB)填充
CRC 校验2 字节CRC-16(多项式 0x1021),高位在前

控制字符定义

字符十六进制含义
SOH0x01标准 XMODEM 起始(128B 包)
STX0x02Xmodem-1K 起始(1024B 包)
EOT0x04传输结束
ACK0x06确认(接收成功)
NAK0x15否认(请求重传或启动)
CAN0x18取消传输(通常连发 2 次)
C0x43请求使用 CRC 模式(包括 Xmodem-1K)

工作流程

接收方发起传输:

        发送 C(表示支持 CRC 模式)

发送方响应:

        收到 C → 启动 Xmodem-1K + CRC 模式

        发送第一个数据包(STX + 序号=1 + ~1 + 1024B数据 + CRC)

接收方处理:

        校验序号、反码、CRC

        正确 → 发送 ACK

        错误 → 发送 NAK,请求重传当前包

继续传输:

        发送方收到 ACK → 发送下一包(序号+1)

        最后一个包发完 → 发送 EOT

结束确认:

        接收方收到 EOT → 回复 ACK,传输完成

错误处理与重传机制

序号校验:检查 seq + (~seq) == 0xFF,防止序号错乱

CRC 校验:比简单校验和更严格

重传策略:接收方发 NAK → 发送方重发当前包,接收方可根据包序判断是否重复包处理

超时机制:发送方等待 ACK

总结

简单,校验完整,广泛应用固件升级,bootloader,通信

无流控,逐包确认效率低,无断点续传,无时间戳