Ymodem协议详解
目录
一、Ymodem 协议概述
1.定义
2.起源
3.核心特点
4.与 Xmodem 协议的区别
二、Ymodem 协议帧结构
1.通用帧结构(基础格式)
2.关键帧类型详解
(1)文件信息帧(块编号 0x00)
(2)数据帧(块编号 0x01~0xFF)
(3)文件结束帧(块编号 0x00,数据区全 0x1A)
(4)取消传输帧(CAN)
三、Ymodem 协议传输流程
1.初始化阶段(握手)
2.文件信息传输阶段
3.文件数据传输阶段
4.文件结束阶段
5.多文件连续传输处理
四、Ymodem 协议应用场景与工具
1.典型应用场景
2.常用工具(支持 Ymodem 传输)
(1)SecureCRT(Windows/macOS/Linux)
(2)TeraTerm(Windows)
(3)Minicom(Linux)
(4)嵌入式 Bootloader(如 U-Boot)
五、常见问题与解决方法
1.传输启动失败(接收端发送 “C”,发送端无响应)
2.传输过程中频繁重传(接收端持续发送 NAK)
3.传输完成后文件损坏(大小正确但内容错误)
4.多文件传输时部分文件丢失
一、Ymodem 协议概述
1.定义
Ymodem 协议是一种基于串口的文件传输协议,是 Xmodem 协议的增强版,主要用于在两台设备之间通过串行通信链路可靠地传输文件,常见于嵌入式系统开发、工业控制等场景。
2.起源
Ymodem 协议由 Chuck Forsberg 在 Xmodem 协议基础上开发,旨在解决 Xmodem 协议传输效率低、不支持多文件传输等问题,弥补了 Xmodem 在实际应用中的不足,成为更实用的串口文件传输方案。
3.核心特点
-
支持多文件传输:可一次性传输多个文件,无需每次传输都重新建立连接,提升多文件传输场景下的效率。
-
较大的数据块尺寸:默认数据块大小为 1024 字节(也支持 128 字节的兼容模式),相比 Xmodem 默认的 128 字节数据块,减少了帧的数量,提高了传输速度。
-
强纠错能力:采用 CRC(循环冗余校验)作为主要校验方式(也兼容 Xmodem 的校验和方式),能有效检测传输过程中出现的错误,若检测到错误,会触发重传机制,保证数据传输的可靠性。
-
文件信息携带:在传输文件前,会先传输文件的名称、大小等信息,方便接收端提前了解文件属性,进行相应的存储准备。
4.与 Xmodem 协议的区别
对比项 | Xmodem 协议 | Ymodem 协议 |
数据块大小 | 默认 128 字节 | 默认 1024 字节(兼容 128 字节) |
多文件传输 | 不支持,需重新建立连接 | 支持,可连续传输多文件 |
校验方式 | 主要为校验和,部分支持 CRC | 主要为 CRC,兼容校验和 |
文件信息传输 | 不传输文件名称、大小等信息 | 传输文件名称、大小等信息 |
传输效率 | 较低(小数据块,帧数量多) | 较高(大数据块,帧数量少) |
二、Ymodem 协议帧结构
Ymodem 协议的帧分为不同类型,核心是数据帧,此外还有命令帧(如文件结束帧、取消传输帧等),以下主要介绍常用的帧结构。
1.通用帧结构(基础格式)
所有 Ymodem 帧均以特定的起始字符开头,后续依次为块编号、块编号反码、数据区(或命令信息)、校验区,整体结构如下:
字段 | 长度(字节) | 说明 |
起始字符(SOH/STX) | 1 | SOH(0x01):表示后续数据块大小为 128 字节;STX(0x02):表示后续数据块大小为 1024 字节 |
块编号(N) | 1 | 范围为 0x00~0xFF,从 0x01 开始递增(文件信息帧块编号为 0x00),超过 0xFF 后重新从 0x00 开始 |
块编号反码(~N) | 1 | 块编号按位取反得到,即~N = 0xFF - N,用于校验块编号的正确性,防止块编号传输错误 |
数据区(Data) | 128/1024 | 若为 SOH 起始,数据区 128 字节;若为 STX 起始,数据区 1024 字节;数据不足时,用 0x1A(EOF 字符)填充 |
校验区(CRC) | 2 | 采用 16 位 CRC 校验,计算范围为 “块编号 + 块编号反码 + 数据区”;兼容模式下可使用 1 字节校验和 |
2.关键帧类型详解
对 Ymodem 协议中最核心的 4 种 “功能帧” 进行拆解,既包括 “传递控制指令的命令帧”(文件结束帧、取消传输帧),也包括 “传递信息 / 数据的非命令帧”(文件信息帧、数据帧);
(1)文件信息帧(块编号 0x00)
在传输每个文件前,会先发送文件信息帧,用于告知接收端文件的基本信息,结构如下:
-
起始字符:SOH(数据区 128 字节,固定用 SOH)
-
块编号:0x00
-
块编号反码:0xFF(0xFF - 0x00 = 0xFF)
-
数据区:前 N 字节为文件名称(ASCII 码),接着 1 字节为 0x00(文件名终止符),再接着为文件大小(ASCII 码,十进制),剩余部分用 0x1A 填充(总长度 128 字节)
-
校验区:2 字节 CRC 校验
示例:其中包号(块编码)为固定为0;Filename为文件名称,文件名称后必须加0x00作为结束;Filesize为文件大小值,文件大小值后必须加0x00作为结束;余下未满128字节数据区域,则以0x00填充。
(2)数据帧(块编号 0x01~0xFF)
传输有效数据时主要考虑的是最后一包数据的是处理,SOH帧和STR帧有不同的处理。
【1】对于SOH帧,若余下数据小于128字节,则以0x1A填充,该帧长度仍为133字节。
【2】对于STX帧需考虑几种情况:
●余下数据等于1024字节,以1029长度帧发送;
●余下数据小于1024字节,但大于128字节,以1029字节帧长度发送,无效数据以0x1A填充。
●余下数据等于128字节,以133字节帧长度发送。
●余下数据小于128字节,以133字节帧长度发送,无效数据以0x1A填充
(3)文件结束帧(块编号 0x00,数据区全 0x1A)
当一个文件传输完成后,发送端会发送文件结束帧,告知接收端当前文件传输结束:
-
起始字符:SOH
-
块编号:0x00
-
块编号反码:0xFF
-
数据区:128 字节全为 0x00
-
校验区:2 字节 CRC 校验
Ymodem的结束帧采用SOH 133字节长度帧传输,该帧不携带数据(空包),即数据区、校验都以0x00填充。
(4)取消传输帧(CAN)
若传输过程中出现异常(如用户主动取消、设备故障),发送端或接收端可发送 CAN(0x18)字符取消传输,通常连续发送 2~3 个 CAN 字符,确保对方能识别。
三、Ymodem 协议传输流程
Ymodem 协议的传输流程主要分为 “初始化阶段”“文件信息传输阶段”“文件数据传输阶段”“文件结束阶段”“多文件连续传输处理” 五个部分,以下以 “发送端(如电脑)向接收端(如嵌入式开发板)传输文件” 为例,详细说明流程:
1.初始化阶段(握手)
-
接收端准备就绪后,向发送端发送 “C” 字符(0x43),表示接收端支持 CRC 校验,请求发送端开始传输(若接收端只支持校验和,会发送 NAK 字符,实际中 CRC 更常用)。
-
发送端接收到 “C” 字符后,确认接收端就绪且支持 CRC 校验,进入文件信息传输阶段。
2.文件信息传输阶段
-
发送端发送 “文件信息帧”(块编号 0x00,包含文件名、文件大小等信息)。
-
接收端接收文件信息帧后,对帧进行校验(检查块编号、反码、CRC):
-
若校验通过:接收端记录文件信息(如创建名为 “test.bin” 的空文件,准备存储 10240 字节数据),并向发送端发送 ACK(0x06),表示确认接收,请求发送数据帧。
-
若校验失败:接收端向发送端发送 NAK(0x15),请求发送端重新发送文件信息帧(最多重传 10 次,超过则取消传输)。
3.文件数据传输阶段
-
发送端接收到 ACK 后,开始按顺序发送数据帧:
-
第一帧数据帧块编号为 0x01,数据区为文件的前 128/1024 字节(根据配置选择数据块大小),带 2 字节 CRC 校验。
-
后续数据帧块编号依次递增(0x02、0x03...0xFF,再循环到 0x00、0x01...),直至文件数据全部发送完成。
-
接收端每接收一帧数据帧,都进行校验:
-
校验通过:接收端将数据区的有效数据(排除填充的 0x1A)写入目标文件,发送 ACK,请求下一个数据帧。
-
校验失败:发送 NAK,请求发送端重传当前数据帧(重传次数上限通常为 10 次,超过则发送 CAN 取消传输)。
-
若发送端连续多次(如 10 次)收到 NAK,或超时未收到接收端的响应(通常超时时间为 3~5 秒),则判定传输失败,发送 CAN 取消传输。
4.文件结束阶段
-
发送端发送完文件的所有数据帧后,发送 “文件结束帧”(块编号 0x00,数据区全 0x1A)。
-
接收端接收文件结束帧并校验通过后,确认当前文件传输完成,发送 ACK。
-
若接收端需要确认文件完整性(可选),可在接收完所有数据后,计算文件的实际大小与文件信息帧中的大小是否一致,若一致则完成存储,不一致则提示传输异常。
示例:
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C
SOH 00 FF “foo.c” "1064’’ NUL[118] CRC CRC >>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C
STX 01 FE data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
STX 02 FD data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
STX 03 FC data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
STX 04 FB data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
SOH 05 FA data[100] 1A[28] CRC CRC>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NAK
EOT>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C
SOH 00 FF NUL[128] CRC CRC >>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
5.多文件连续传输处理
-
若发送端需要传输多个文件,在第一个文件的 “文件结束帧” 被接收端 ACK 后,无需重新握手,直接发送下一个文件的 “文件信息帧”,重复 “文件信息传输→数据传输→文件结束” 的流程。
-
当所有文件都传输完成后,发送端会发送两个连续的 “文件结束帧”(即先发送一个文件结束帧,接收 ACK 后,再发送一个文件结束帧)。
-
接收端接收到第二个文件结束帧后,确认所有文件传输完成,向发送端发送 ACK,传输流程正式结束。
四、Ymodem 协议应用场景与工具
1.典型应用场景
-
嵌入式系统开发:向嵌入式开发板(如 STM32、ARM9 开发板)传输固件(.bin/.hex 文件)、配置文件等,常用于开发板的程序烧录或参数更新。
-
工业控制:在工业设备(如 PLC、传感器模块)之间传输控制程序、日志文件等,通过串口实现可靠的数据交互。
-
老旧设备数据交互:对于无以太网、USB 等高速接口,仅支持串口的老旧设备,Ymodem 协议是实现文件传输的主要方式(如早期的路由器、交换机配置文件传输)。
2.常用工具(支持 Ymodem 传输)
(1)SecureCRT(Windows/macOS/Linux)
-
发送文件步骤:
-
通过串口连接接收端设备(配置正确的波特率、数据位、停止位、校验位,如 9600 8N1)。
-
接收端发送 “C” 字符(部分设备会自动发送,如嵌入式开发板的 Bootloader)。
-
在 SecureCRT 菜单栏中选择 “Transfer”→“Send Ymodem”。
-
在弹出的文件选择窗口中,选择要传输的文件(可多选,支持多文件传输),点击 “Open” 开始传输。
-
传输过程中,SecureCRT 会显示传输进度、速度、帧数量等信息,传输完成后提示 “Transfer complete”。
-
接收文件步骤:
-
串口连接成功后,在 SecureCRT 菜单栏选择 “Transfer”→“Receive Ymodem”。
-
选择文件保存路径,点击 “OK”。
-
发送端开始发送文件,SecureCRT 自动接收并存储,完成后提示成功。
(2)TeraTerm(Windows)
-
发送文件:连接串口后,选择 “File”→“Transfer”→“Ymodem”→“Send”,选择文件即可。
-
接收文件:选择 “File”→“Transfer”→“Ymodem”→“Receive”,选择保存路径,等待发送端传输。
(3)Minicom(Linux)
-
进入 Minicom 后,按
Ctrl+A
,再按S
,选择 “Ymodem”,然后选择文件发送;接收时按Ctrl+A
,再按R
,选择 “Ymodem”,等待接收。
(4)嵌入式 Bootloader(如 U-Boot)
许多嵌入式设备的 Bootloader(如 U-Boot)内置 Ymodem 接收功能,在 Bootloader 模式下,输入命令(如loady
),设备会发送 “C” 字符,此时通过上位机(如 SecureCRT)发送文件,即可实现固件烧录。
五、常见问题与解决方法
1.传输启动失败(接收端发送 “C”,发送端无响应)
-
可能原因:
-
串口连接参数不匹配(波特率、数据位、停止位、校验位错误)。
-
发送端未识别到接收端的 “C” 字符(如工具未开启 Ymodem 接收 / 发送模式)。
-
串口线接触不良或损坏(如 TX/RX 引脚接反)。
-
解决方案:
-
重新确认串口参数,确保发送端与接收端完全一致(如波特率统一为 115200,数据位 8,停止位 1,无校验)。
-
检查工具模式:发送端需开启 “Send Ymodem”,接收端需开启 “Receive Ymodem”(或设备 Bootloader 已进入 Ymodem 接收模式)。
-
检查串口线:更换串口线,确认 TX 接对方 RX,RX 接对方 TX,GND 共地(避免交叉接反)。
-
传输过程中频繁重传(接收端持续发送 NAK)
2.传输过程中频繁重传(接收端持续发送 NAK)
-
可能原因:
-
串口波特率过高,超出链路抗干扰能力(如长距离传输时用 115200 波特率,信号衰减导致错误)。
-
传输环境干扰大(如附近有强电磁设备,导致串口信号噪声)。
-
数据块大小设置不合理(如接收端仅支持 128 字节数据块,发送端用 1024 字节数据块)。
-
解决方案:
-
降低波特率(如从 115200 降至 57600 或 9600),减少信号传输压力。
-
远离强电磁干扰源,或使用带屏蔽层的串口线。
-
统一数据块大小:在工具中设置发送端使用 128 字节数据块(如 SecureCRT 发送时勾选 “128-byte blocks”)。
-
传输完成后文件损坏(大小正确但内容错误)
3.传输完成后文件损坏(大小正确但内容错误)
-
可能原因:
-
校验方式不匹配(发送端用 CRC,接收端用校验和)。
-
数据块填充字符处理错误(接收端未排除 0x1A 填充字符,将填充字节写入文件)。
-
发送端文件本身损坏(如源文件被篡改)。
-
解决方案:
-
确保发送端与接收端校验方式一致(优先使用 CRC 校验,工具中默认多为 CRC)。
-
检查接收端程序:确认接收数据时,仅提取有效数据(即文件实际大小以内的字节,排除末尾填充的 0x1A)。
-
验证源文件:重新确认发送的源文件完整性(如计算 MD5 值,与接收端文件 MD5 对比)。
-
多文件传输时部分文件丢失
4.多文件传输时部分文件丢失
-
可能原因:
-
接收端未正确识别 “多文件结束标志”(仅接收一个文件结束帧就停止接收)。
-
发送端多文件列表配置错误(如漏选文件,或文件路径错误)。
-
解决方案:
-
确认接收端程序逻辑:支持接收两个连续的文件结束帧作为多文件传输结束标志。
-
检查发送端文件选择:在工具中重新选择所有需要传输的文件,确保无遗漏,且文件路径无特殊字符(如中文、空格,部分老旧接收端不支持)。