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  // 响应取消

关键协议特征

  1. 序号机制

    • 数据包序号从 01 开始递增
    • 每个序号后紧跟其补码(01FE02FD
  2. 填充规则

    • 文件信息包固定128字节(不足填 00
    • 数据块不足1024字节时:
      01 (SOH) 02 FD [128B数据] 1A 1A...(填充SUB字符)
      
  3. CRC 计算

    • 涵盖包头(SOH/STX + 序号 + 补码)和有效数据
    • 计算范围示例:
      crc = calc_crc([0x02, 0x01, 0xFE] + file_data[0:1024])
      

实际抓包工具:使用串口监控软件(如 AccessPort)可捕获完整数据流,重点关注 SOH/STX 起始符、序号序列和 CRC 值的变化。在嵌入式开发中,此数据流分析是调试文件传输故障的核心依据。