Ymodem协议

Ymodem协议

0. 文件传输协议概述

​ 在进行文件传输时,为使文件能被正确识别和传送,需要在两台计算机之间建立统一的传输协议,协议需要包括了文件的识别、传送的起止时间、错误的判断与纠正等内容。常用的文件传输协议有:

  1. ASCII:传输速度快最快,但只能传送文本文件。
  2. Xmodem:协议古老悠久,传输速度较慢,采用了CRC校验算法,传输的准确率可高达99.6%;每次传输信息块为128字节。
  3. Ymodem:Ymodem是Xmodem的改进版,每次传输信息块最大1024字节,速度比Xmodem快;同时还支持传输多个文件。
  4. Zmodem:Zmodem采用了串流式(streaming)传输方式,传输速度较快,而且还具有自动改变区段大小和断点续传、快速错误侦测等功能。Zmodem目前最流行的文件传输协议。

Ymodem协议用于计算机间传输文件,同样适用于嵌入式领域,如MCU升级固件时,可以使用Ymodem协议传输固件文件,传输总线不限于USB、UART、CAN等。

1. 数据帧类型

名称 帧头 包号 包号反码 信息块 校验(高位) 校验(低位)
简写 SOH/STX PN XPN DATA CRC-H CRC-L
字节数 1 1 1 1024/128 1 1
帧头 SOH(0x01) STX(0x02)
信息块长度 128字节 1024字节

​ 若不允许回绕Ymodem协议支持最大255KB大小的文件传输

1.1 SOH

​ 以SOH(0x01)开始的数据包,信息块是128字节,该类型帧总长度为128+5(133)字节。

1.2 STX

​ 以STX(0x02)开始的数据包,信息块是1024字节,该类型帧总长度为1024+5(1029)字节

1.3 包号与包反码

  • 包头和包反码都是 uint8_t 类型,范围0x00 ~ 0xFF(0~255),每发送一个数据包递增 1,超过 255 后回绕到

  • 包反码的计算: 包反码 = 0xFF - 包号。由此可得出包序号校验为 包号 + 包反码 = 0XFF

  • 当包号出现错误时,发送NAK要求重传

  • 当包号出现非预期值时(期望0x02,但出现0x01),可能出现丢包或乱序,要求重传

1.4 CRC校验

​ 多项式公式: x^16 + x^12 + x^5 + 1 (0x1021)

​ Ymodem协议的校验码为16位,占两个字节,即CRC16,传输时CRC高八位在前,低八位在后;CRC计算数据为信息块数据,不包含帧头包号包号反码

2. Ymodem起始帧(size == 133byte)

名称 帧头 包号 包号反码 文件名 文件大小 填充区 校验(高位) 校验(低位)
简写 SOH 0x00 0xFF Filename +0x00 Filename +0x00 NULL(0x00) CRC-H CRC-L

​ 其中包号为固定为0;Filename为文件名称,文件名称后必须加0x00作为结束;Filesize为文件大小值,文件大小值后必须加0x00作为结束;余下未满128字节数据区域,则以0x00填充。

例如:

SOH 00 FF "data.bin" NUL "2048" NUL "1630454400" NUL [NUL填充...] CRC16

3. Ymodem数据帧(size == 133byte 1028byte)

名称 帧头 包号 包号反码 数据域 填充区(文件内容小于帧长度时) 校验(高位) 校验(低位)
简写 SOH/STX 0x01~0xFF 0xFF - 包号 文件内容 0x1A填充 CRC-H CRC-L
长度 1 1 1 128 or 1024 剩余部分 1 1
  • 传输有效数据时主要考虑的是最后一包数据的是处理,SOH帧和STX帧有不同的处理。
  1. 对于SOH帧,若余下数据小于128字节,则以0x1A填充,该帧长度仍为133字节。

  2. 对于STX帧需考虑几种情况:

  • 余下数据 == 1024 字节,以1029长度帧发送;
  • 余下数据 < 1024 字节,但 > 128字节,以1029字节帧长度发送,无效数据以0x1A填充。
  • 余下数据 == 128 字节,以133字节帧长度发送。
  • 余下数据 < 128 字节,以133字节帧长度发送,无效数据以0x1A填充。

4. Ymodem结束帧(size == 133byte)

帧头 包号 包号反码 数据区 校验高位 校验低位
SOH 0x00 0xFF 0x00 0x00 0x00
  • Ymodem的结束帧采用SOH 133字节长度帧传输,该帧不携带数据(空包),即数据区、校验都以0x00填充。

5. Yomdem握手信号

Ymodem 握手分为三个阶段:

  1. 接收方 发起 传输请求(YMODEM_C)
  2. **发送方 **发送 文件头包(起始帧)
  3. **接收方 **确认 文件头包(ACK/NAK)

示例:

接收方 -> 发送方: 'C'  
发送方 -> 接收方: SOH头包(CRC错误)  
接收方 -> 发送方: NAK(0x15)  // 要求重传 
发送方 -> 发送方: 重传SOH头包  接收方 -> 发送方: ACK         // 确认成功

Ymodem协议命令表

命令名称 命令码(Hex) 说明 备注
YMODEM_SOH 0x01 128 字节数据块头 数据包总长度 133 字节(SOH + 包号 + 反码 + 128 数据 + 2 字节 CRC)
YMODEM_STX 0x02 1024 字节数据块头 数据包总长度 1029 字节(STX + 包号 + 反码 + 1024 数据 + 2 字节 CRC)
YMODEM_EOT 0x04 文件传输结束标志 发送方发送此字符表示当前文件传输完成,接收方需回复ACK确认。
YMODEM_ACK 0x06 确认响应 接收方校验数据包成功后发送,要求发送方继续传输下一包。
YMODEM_NAK 0x15 否定确认 / 重传请求 接收方检测到数据包错误时发送,要求发送方重传当前包。
YMODEM_CAN 0x18 取消传输 任意一方发送两次CAN(如0x18 0x18)终止传输。
YMODEM_C 0x43 CRC 模式初始化请求 接收方发送'C'(ASCII 字符)启动传输,要求使用 CRC-16 校验和 1024 字节块。
YMODEM_NUL 0x00 填充字符 / 分隔符 用于文件头包中的文件名、大小字段分隔及填充剩余空间。
YMODEM_CTRLZ 0x1A 数据填充字符 数据包不足块大小时,用此字符填充剩余空间(仅限数据帧)。

参考链接

Ymodem协议要点 - Acuity - 博客园

Ymodem协议解析-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/905527.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

整车销售管理怎么做?4S店整车销售7大模块!

这篇跟大家聊聊4S店整车销售管理到底该怎么做?干这行七八年了,从一线销售爬到区域总监,这里面的门道我总结成七大模块,全是实战干货,看完直接落地用!下述所示整车管理系统>> https://s.fanruan.com/mx0aj 一、系统底层逻辑:四个核心齿轮咬合 1.库存管理是心脏 每天…

CSS 实现滚动条的隐藏但保留滚动功能

CSS 实现滚动条的隐藏但保留滚动功能CSS 实现滚动条的隐藏但保留滚动功能 有几种方法可以在网页中隐藏滚动条但保留滚动功能,以下是常见的实现方式,使用 CSS:使用 ::-webkit-scrollbar(适用于 Webkit 内核浏览器,如 Chrome、Safari)/* 隐藏滚动条但保留滚动功能 */ body …

cccxm

29593138陈晓明

愚人节恶搞代码:系统错误倒计时与节日彩蛋动画

为你的网页增添趣味性和互动性!通过JavaScript轻松创建一个逼真的“系统错误倒计时”画面,结合动态进度条和节日彩蛋动画,为你的用户带来意想不到的惊喜。无论是愚人节还是特殊节日,这段代码都能为你的网站增添一份独特的幽默感和创意。距离愚人节还有一周时间,在这个充满…

RFDN:用于轻量级图像超分辨率的残差特征蒸馏网络

在本文中,我们提出了一种**特征蒸馏连接(feature distillation connection FDC)**,它在功能上等同于通道分裂操作,同时更加轻量级和灵活。多亏了FDC,我们可以重新思考信息**多蒸馏网络(information multi-distillation network IMDN)**,并提出一个轻量级和准确的SISR模…

AI编程的 9 个大坑

原帖:[X@cj_zZZz](x.com) 我每天使用AI工具编程6-7小时。 在过去12个月里开发了超过36个项目。 事实是:用一个提示"给我构建...应用"是不可能的。 所以,以下是你在使用AI编程时可能犯的所有错误: 1. 没有规划 通过我的规划技巧,我能在几小时内从想法到一个写得很…

从按键到语音:家电设备交互的演进之旅

家电,在人们的日常生活中扮演着不可或缺的角色,也是提升人们幸福感的重要组成部分,那你了解家电的发展史吗? #70年代 结婚流行“四大件”:手表、自行车、缝纫机,收音机,合成“三转一响”。#80年代 随着改革开放的深化,中国经济开始飞速发展,黑白电视机、冰箱、洗衣机这…

Docker环境搭建与容器化入门实战——从虚拟机配置到应用部署

作者信息 姓名:林俊祥 专业:云计算技术应用 学号:23593107 技术方向:云平台搭建与部署 一、项目背景 本次实践基于Ubuntu系统,通过虚拟机环境完成Docker的完整部署流程,涵盖: 虚拟机创建与系统安装 SSH远程连接配置 Docker引擎安装与容器管理 应用容器化实战三、关键技术…

Vibe Coding彻底火了,到底什么是氛围编程?它如何改变未来的软件开发?

在过去十年间,低代码/无代码平台和 AI 代码助手持续冲击着软件开发行业。如今,一种被称为 Vibe Coding 的新兴实践突然走红,甚至颠覆了人们对"程序员到底在做什么"的认知。本篇文章将从定义到实践策略、从优势到局限性,全方位探讨 Vibe Coding 给软件开发带来的重…

知识蒸馏实战

蒸馏实战小实验 本实验相关代码已开源至github 失败经历 爱爱医数据蒸馏Qwen2.5-7B 1.用爬虫在爱爱医网站爬取1k条数据。(刚学一点爬虫,不会越过验证码,还是自己一次一次验证😅) 2.数据格式预处理,例如: {"instruction": "你需要基于我提供的患者病历,…

VLM-R1环境搭建推理测试

引子 前文也写了DeepSeek R1模型的安装测试,感兴趣的童鞋移步(https://blog.csdn.net/zzq1989_/article/details/145400876?spm=1001.2014.3001.5502)。那么在多模态方面R1方法(GRPO,Group Relative Policy Optimization)能不能用呢?毫无疑问,已经有不少人在尝试了。今…