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),高位在前 |
控制字符定义
| 字符 | 十六进制 | 含义 |
|---|---|---|
| SOH | 0x01 | 标准 XMODEM 起始(128B 包) |
| STX | 0x02 | Xmodem-1K 起始(1024B 包) |
| EOT | 0x04 | 传输结束 |
| ACK | 0x06 | 确认(接收成功) |
| NAK | 0x15 | 否认(请求重传或启动) |
| CAN | 0x18 | 取消传输(通常连发 2 次) |
| C | 0x43 | 请求使用 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,通信
无流控,逐包确认效率低,无断点续传,无时间戳