YMODEM 完整文件传输数据流解析(以 1024 字节文件为例)
传输角色:
- 发送方:Tera Term
- 接收方:嵌入式设备(运行
rz
命令)
完整数据流(十六进制表示)
sequenceDiagram
participant Sender as 发送方(Tera Term)
participant Receiver as 接收方(嵌入式设备)
Note over Receiver: 启动接收程序 rz -y
Receiver->>Sender: 43 ('C') // 请求CRC模式
Note over Sender: 发送文件头包(序号0)
Sender->>Receiver: 01(SOH) 00(序号) FF(补码) [文件名+文件大小+填充] CRC16_LO CRC16_HI
alt 头包接收成功
Receiver->>Sender: 06 (ACK)
else 头包错误
Receiver->>Sender: 15 (NAK) // 要求重传
end
Note over Sender: 发送数据块(序号1)
Sender->>Receiver: 02(STX) 01(序号) FE(补码) [1024B数据] CRC16_LO CRC16_HI
alt 数据块接收成功
Receiver->>Sender: 06 (ACK)
else 数据块错误
Receiver->>Sender: 15 (NAK)
end
Note over Sender: 文件结束
Sender->>Receiver: 04 (EOT)
Receiver->>Sender: 06 (ACK)
Note over Sender: 发送批处理结束包
Sender->>Receiver: 01(SOH) 00(序号) FF(补码) [空文件名] CRC16_LO CRC16_HI
Receiver->>Sender: 06 (ACK)
详细数据包分解
1. 初始化阶段
接收方 -> 发送方: 43 // ASCII 'C',请求CRC-16校验模式
2. 文件信息包(序号0)
发送方 -> 接收方:
01 // SOH(128字节包标识)
00 // 包序号0
FF // 序号补码(0x00的补码=0xFF)
66 69 6C 65 2E 74 78 74 00 // "file.txt" + NULL结束符
31 30 32 34 00 // "1024"(文件大小)+ NULL
00 00 00...(共128字节,剩余填充0)
CRC16_LOW // CRC低字节(例如:25)
CRC16_HIGH // CRC高字节(例如:8C)
3. 数据包(序号1)
发送方 -> 接收方:
02 // STX(1024字节包标识)
01 // 包序号1
FE // 序号补码(0x01的补码=0xFE)
[1024字节文件数据] // 实际文件内容
CRC16_LOW // 例如:7A
CRC16_HIGH // 例如:3B
4. 文件结束与批处理终止
发送方 -> 接收方: 04 // EOT(文件结束)
接收方 -> 发送方: 06 // ACK
发送方 -> 接收方:
01 // SOH
00 // 包序号0
FF // 序号补码
00 // 空文件名标识(第一个字节为0)
00 00...(128字节全0填充)
CRC16_LOW // 例如:D4
CRC16_HIGH // 例如:29
接收方 -> 发送方: 06 // ACK(传输完成)
异常场景数据流
场景:数据包 CRC 校验失败
sequenceDiagram
Sender->>Receiver: STX 01 FE [数据] CRC(错误)
Receiver->>Sender: 15 (NAK) // 校验失败
Sender->>Receiver: STX 01 FE [数据] CRC(正确) // 重传相同序号包
Receiver->>Sender: 06 (ACK) // 确认接收
场景:传输中途取消
发送方 -> 接收方: 18 18 18 // 连续3个CAN(取消指令)
接收方 -> 发送方: 18 18 18 // 响应取消
关键协议特征
-
序号机制:
- 数据包序号从
01
开始递增 - 每个序号后紧跟其补码(
01
→FE
,02
→FD
)
- 数据包序号从
-
填充规则:
- 文件信息包固定128字节(不足填
00
) - 数据块不足1024字节时:
01 (SOH) 02 FD [128B数据] 1A 1A...(填充SUB字符)
- 文件信息包固定128字节(不足填
-
CRC 计算:
- 涵盖包头(SOH/STX + 序号 + 补码)和有效数据
- 计算范围示例:
crc = calc_crc([0x02, 0x01, 0xFE] + file_data[0:1024])
实际抓包工具:使用串口监控软件(如 AccessPort)可捕获完整数据流,重点关注
SOH/STX
起始符、序号序列和 CRC 值的变化。在嵌入式开发中,此数据流分析是调试文件传输故障的核心依据。