微控圈（MCU Loop） - YMODEM
type: channel
link: https://www.mculoop.com/tag/YMODEM/
items: YMODEM 协议

YMODEM 协议
type: item
date: 2024-01-10T10:39:00+00:00
description: YMODEM 协议是一种高效的文件传输协议，通常用于调制解调器之间的数据传输。YMODEM 协议的产生是为了解决 XMODEM 协议存在的一些问题。相较于 XMODEM，YMODEM 协议在数据传输效率和稳定性上有所改进。 YMODEM 协议的主要特点包括： 数据包大小：YMODEM 协议支持以 1024 字节（或 1K）的块进行数据传输，这比 XMODEM 协议通常使用的 128 字节块要大得多，从而提高了传输效率。 错误纠正：YMODEM 协议采用循环冗余校验（CRC16）进行错误检测，并在发现错误时请求重发数据块，以确保数据的正确传输。 批处理模式：YMODEM 协议支持批处理模式，允许使用单个命令传输多个文件，这在传输大量文件时非常有用。 文件名传输：在发送文件数据之前，YMODEM 协议会先发送文件名和文件大小等信息，以便接收方能够正确地保存文件。 YMODEM 协议中定义了几种关键字： 关键字 值 说明 SOH 0x01 协议头（128 bytes 类型） STX 0x02 协议头（1K 类型） EOT 0x04 传输结束 ACK 0x06 接收响应 NAK 0x15 失败响应 CAN 0x18 取消传输 C 0x43 开启文件传输 CPMEOF 0x1A 数据补齐填充字符（^Z，控制字符 Z） YMODEM 传输协议： SOH [index] [index2] [128 bytes data] [CRC-hi] [CRC-lo] STX [index] [index2] [1024 bytes data] [CRC-hi] [CRC-lo] index 是帧序号，0 ~ 255，传输时递增。 index2 是index取反，也即：index2 = ~index = 255 - index crc16 校验数据域 [data] 在 YMODEM 协议的基本流程中，发送方会先发送一个起始帧，其中包含文件名和文件大小等信息。接收方在收到起始帧后，会发送一个确认信号（ACK）。然后，发送方开始以 1024 字节的块发送文件数据，每发送一个数据块后都会等待接收方的 ACK 信号。如果接收方成功接收到数据块并通过 CRC 校验，则发送 ACK 信号；否则，发送否定确认信号（NAK）请求重发。当文件传输完成后，发送方会发送一个结束帧（EOT），接收方在收到结束帧后会再次发送 ACK 信号进行确认。 交互序列图： 传输时先发送一个 128 字节的文件信息块，将文件名和文件大小发送给设备。 SOH 00 FF [filename] [filesize] [NULL] CRCH CRCL [filename] 文件名，如文件名 foo.c，它在数据帧中存放格式为：66 6F 6F 2E 63 00 [filesize] 文件大小，例如大小为 400 bytes，它在数据帧的存放格式为：34 30 30 00，即 “400”。（不同的软件可能有所却别） [NULL] 表示剩下的字节都用 00 填充 传输文件内容时，如果文件数据的最后剩余的数据在 128 ~ 1024 之间，则还是使用 STX 的 1024 字节传输；如果文件大小小于等于 128 字节，则选择 SOH 数据帧用 128 字节来传输数据。若数据不足一帧，用 CPMEOF 来填充。 附： XMODEM/YMODEM 协议： http://pauillac.inria.fr/~doligez/zmodem/ymodem.txt ZMODEM 协议： http://gallium.inria.fr/~doligez/zmodem/zmodem.txt