STM32 Ymodem 协议及代码解析
点击左上角的
“关注”
,定期更新 STM32 最新资讯,总有你想要的信息!
STM32 Ymodem 协议及代码解析
文章导图:
1. Ymodem 协议传输效果
1.1 发送端软件效果图
- SecureCRT 软件:SecureCRT 支持 Ymodem 协议传输,可以作为接收端也可以作为发送端,这里我们作为发送端发送升级固件给 STM32 接收端。
- 自制发送端软件:这个是我用 PyQt5 制作的 STM32 IAP 升级软件,作为 Ymodem 发送端发送升级固件给 STM32 接收端。
1.2 STM32接收端效果图
STM32 作为 Ymodem 接收端接收升级固件进行升级。
2. Ymodem 协议介绍
YModem 协议是由 XModem 协议演变而来的,每包数据可以达到 1024 字节,是一个非常高效的文件传输协议。我们平常所说的 Ymodem 协议是指的 Ymodem-1K,除此还有 Ymodem-g(没有 CRC 校验,不常用)。YModem-1K 协议用 1024 字节数据帧传输取代了标准的 128 字节数据帧传输,发送的数据会使用 CRC 校验,保证数据传输的正确性。它每传输一个信息块时,就会等待接收端返回 ACK 信号,接收到响应信号后,才会继续传输下一个信息块,从而保证能够接收到全部数据。
3. Ymodem 协议的最低要求
所有声称支持 Ymodem 协议的项目必须满足以下最低要求:
- 发送端应在第一个数据包中发送路径名(文件名)。
- 路径名应为以 “NULL” 结尾的 ASCII 字符串,如下所述:
- 1)除非有特别要求,否则只发送文件名部分。
- 2)不发送驱动器符号。
- 3)不区分文件名中大小写字母的系统应仅以小写形式发送路径名。
- 接收端应使用第一个数据包中发送的路径名作为接收文件名。
- 当接收端接收到第一个数据包并成功打开输出文件后,应该返回一个 “ACK” 字符给发送端用来确认这个数据包,然后接收端再发送 “C” 或 “NAK” 来开始进行正常的 Ymodem 传输。
- 接收端在接收每个文件时要能接受 128 字节和 1024 字节两种数据包的任意混合发送。发送端可以在 1024 字节和 128 字节两种数据包之间任意切换发送。
- 发送端不能更改未确认的数据包的长度。
- 在每次文件传输的末尾,发送端只能发送最多 10 次 “EOT” 字符,直到它收到一个 “ACK” 字符。(这是 Xmodem 规范的一部分。)
- 发送路径名为空的路径名数据包来表示传输会话的结束,该路径名数据包应与其它路径名数据包一样被确认。
没有满足以上要求的程序不兼容 Ymodem 协议,不应被描述为支持 Ymodem 协议。
4. Ymodem 协议帧详解
4.1 帧格式
Ymodem 有两种帧格式,主要区别是数据长度的不同。
名称 | 结构 | 长度(byte) | 标识符 | 备注 |
---|---|---|---|---|
帧头 | SOH/STX | 1 | 0x01/0x02 |
表示帧格式类型; SOH 为 128 字节帧,STX 为 1024 字节帧; |
帧序号 | FN | 1 |
帧序号为 1 个字节,取值范围为 0~255; 当帧序号大于 255 后,序号重新从 0 开始累加; |
|
帧序号反码 | XFN | 1 | 帧序号的反码,数值为 0xFF-FN; | |
数据 | DATA | 128/1024 |
帧头是 SOH 的数据帧,数据为 128 字节,该类型帧的总长度为 133 字节; 帧头是 STX 的数据帧,数据是 1024 字节,该类型帧总长度为 1029 字节; |
|
校验 | CRC | 2 |
Ymodem 采用的是 CRC16 校验算法,校验值为 2 字节,传输时 CRC 高八位在前,低八位在后; CRC 计算的是数据部分,不包含帧头、帧序号和帧序号反码; |
4.2 帧命令
命令 | 命令码 | 备注 |
---|---|---|
SOH | 0x01 | start of 128-byte data packet |
STX | 0x02 | start of 1024-byte data packet |
EOT | 0x04 | end of transmission |
ACK | 0x06 | acknowledge |
NAK | 0x15 | negative acknowledge |
CA | 0x18 | two of these in succession aborts transfer |
C | 0x53 | ‘C’ == 0x43, request command |
ABORT1 | 0x41 | ‘A’ == 0x41, abort by user |
ABORT2 | 0x61 | ‘a’ == 0x61, abort by user |
4.3 起始帧
Ymodem 的起始帧并不直接传输文件的数据,而是将文件名和文件大小放在数据段中进行传输。
它的帧结构如下所示:
名称 | 结构 | 长度(byte) | 标识符 | 备注 |
---|---|---|---|---|
帧头 | SOH/STX | 1 | 0x01 | 起始帧为128字节帧; |
帧序号 | FN | 1 | 0x00 | 起始帧的帧序号固定为 0x00; |
帧序号反码 | XFN | 1 | 0xFF | 起始帧的帧序号反码固定为 0xFF; |
数据 | FILENAME | 要传输的文件名; | ||
数据 | FILESIZE | 要传输的文件大小; | ||
数据 | NULL | 若 FILENAME 和 FILESIZE 加起来不满 128 字节则以 0x00 填充剩余字节; | ||
校验 | CRC | 2 | 数据部分的 CRC 校验; |
- 帧头为 SOH,表示起始帧中包含着128个字节的数据。
- 起始帧帧序号固定为 0x00,帧序号反码为 0xFF。
- FILENAME 是要传输的文件名,如 Template.bin,它在数据帧中的格式为:0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,0x2E,0x62,0x69,0x6E,0x00,也就是把 ASCII 码转成十六进制,但是最后一定要在文件名后加上 0x00,表示文件名的结束。
- FILESIZE 是要传输的文件大小,如上面的 Template.bin 大小 107544 byte,转换成十六进制就是 0x1A418。它在数据帧中的格式可以是十进制数的 0x31,0x30,0x37,0x35,0x34,0x34,也可以是十六进制数的 0x30,0x78,0x31,0x41,0x34,0x31,0x38,同样最后要加上 0x00 表示结束。
- NULL 是数据部分若 FILENAME 和 FILESIZE 加起来不满 128 字节则以 0x00 填充剩余字节。
- CRC 表示的是数据部分的 CRC 校验,不包含帧头、帧序号和帧序号反码。校验值为 2 字节,传输时 CRC 高八位在前,低八位在后。
4.4 数据帧
YModem 数据帧会将数据段用来传输文件。
它的帧结构如下所示:
名称 | 结构 | 长度(byte) | 标识符 | 备注 |
---|---|---|---|---|
帧头 | SOH/STX | 1 | 0x01/0x02 | 数据帧可以是 128 字节帧或 1024 字节帧; |
帧序号 | FN | 1 | 数据帧帧序号为 0~255; | |
帧序号反码 | XFN | 1 | 帧序号的反码,数值为0xFF-FN; | |
数据 | DATA | 要传输的数据; | ||
数据 | FILL | 若 DATA 不满 128/1024 字节则以 0x1A 填充剩余字节; | ||
校验 | CRC | 2 | 数据部分的 CRC 校验; |
- 帧头为 SOH 时,表示数据帧的数据段为 128 个字节;帧头为 STX 时,表示数据帧的数据段为 1024 个字节。
- 数据帧帧序号的取值范围为 0~255,帧序号反码是它的取反;
- DATA 表示要传输的文件数据;
- FILL 是数据部分若 DATA 不满 128/1024 字节则以 0x1A 填充剩余字节。
- CRC 表示的是数据部分的 CRC 校验,不包含帧头、帧序号和帧序号反码。校验值为 2 字节,传输时 CRC 高八位在前,低八位在后。
4.5 结束帧
YModem 的结束帧也采用帧头为 SOH 的 128 字节帧,它的结构如下:
名称 | 结构 | 长度(byte) | 标识符 | 备注 |
---|---|---|---|---|
帧头 | SOH | 1 | 0x01 | 结束帧为 128 字节帧; |
帧序号 | FN | 1 | 0x00 | 结束帧的帧序号固定为 0x00; |
帧序号反码 | XFN | 1 | 0xFF | 结束帧的帧序号反码固定为 0xFF; |
数据 | DATA | 128 | 结束帧的数据部分不存放任何信息,全部用 0x00 填充; | |
校验 | CRC | 2 | 数据部分的 CRC 校验; |
- 帧头为 SOH,表示结束帧中包含着 128 个字节的数据。
- 结束帧帧序号固定为 0x00,帧序号反码为 0xFF。
- 结束帧的 128 字节的数据部分不存放任何信息,即全部用 0x00 填充。
- CRC 表示的是数据部分的 CRC 校验,不包含帧头、帧序号和帧序号反码。校验值为 2 字节,传输时 CRC 高八位在前,低八位在后。
5. 文件传输过程
文件的传输过程我们用具体的例子来说明。将大小为 107544 byte 的文件 “Template.bin” 作为传输对象,则它的传输过程如下:
- 当发送端选择完发送文件后则进入准备发送文件状态。
- 当接收端想要开始接收文件时发送命令 ‘C’ 请求发送端开始传输文件,然后开始等待发送端的起始帧。如果发送端没有发送起始帧,则接收端可选择超时退出或者继续发送命令 ‘C’ 请求发送端开始传输文件。
- 发送端在开始时处于准备发送文件状态,等待接收端发送命令 ‘C’。在发送端收到命令 ‘C’ 后发送起始帧给接收端,内容如下(文件名为 Template.bin,文件大小为 107544 byte):
SOH 00 FF FILENAME[54 65…6E 00] FILESIZE[31 30…34 00] NULL[108] CRC
然后发送端开始等待接收端发送 ‘ACK’。 - 当接收端收到起始帧,CRC 校验通过且确定要接收此文件后,则发送 ‘ACK’ 给发送端。
- 发送端收到 ‘ACK’ 后则开始等待接收端的“请求开始传输数据”信号,即重新进入等待接收端发送命令 “C” 的状态。
- 接收端发送命令 ‘C’,请求发送端开始传输数据。
- 发送端在收到命令 ‘C’ 后,开始发送数据帧。内容如下:
STX 01 FE DATA[1024] CRC
然后发送端开始等待接收端发送 ‘ACK’。 - 接收端收到数据帧后,返回一个 ‘ACK’,然后等待接收下一个数据帧,再继续返回 ‘ACK’。直到所有数据传输完毕。
- 数据传输完毕后,发送端发送 ‘EOT’ 命令给接收端,接收端第一次收到 ‘EOT’ 命令后返回 ‘NAK’,要求进行二次确认。发送端收到 ‘NAK’ 后,重发 ‘EOT’ 命令。接收端第二次收到 ‘EOT’ 命令,返回 ‘ACK’ 应答,确认文件传输完毕。
- 最后接收端发送命令 ‘C’ 请求发送端开启下一个文件传输,发送端在没有第二个文件要传输的情况下,发送结束帧给接收端。内容如下:
SOH 00 FF NULL[128] CRC
在接收端返回 ‘ACK’ 后,正式结束数据传输。
6. STM32 代码解析
6.1 ymodem_rx 类图
大家的支持就是我分享技术的动力,希望大家需转载时能附上原作者的博客:https://blog.csdn.net/u012993936,谢谢。
--- End ---
你可能还想看:
> STM32 IAP 在线升级项目实例剖析
> 免费的Zigbee抓包神器!比Ubiqua还好用!
文章都看完了,随手点个赞吧~
↓↓↓ ↓↓↓
STM32 Ymodem 协议及代码解析相关推荐
- stm32驱动NRF24L01_原理+代码解析
目录 概念 废话篇(24L01简介) 引脚分配 工作模式 通信地址理解(个人疑难点) 原理分析 寄存器赏析 寄存器操作指令 配置寄存器(CONFIG,位置:0X00) 自动应答使能寄存器(EN_AA, ...
- 基于STM32的LTC6804驱动代码解析
在上次项目中用到了LTC6804这块片子,初次使用它的采集精度确实令我惊讶到了,设备用于监测2V的铅酸电池组,硬件上几乎没有加任何滤波,直接读取数据就能达到3mv以下的精度,片子真的很好用. 下面总结 ...
- stm32 Bootloader设计(YModem协议)
相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootload设计.所以就仔细的去了研究了一翻.以前都是用的stm32官 ...
- 基于STM32+0.96寸OLED - - 7脚SPI接线显示+代码解析
前言 本次我们学习一下STM32关于SPI七脚OLED的 接线方法,OLED的代码解析,主要教会大家怎么使用OLED调试和看懂OLED驱动的代码,让大家对OLED有个简单的了解,本篇博客大部分是自己 ...
- STM32F103代码远程升级(三)基于YModem协议串口升级程序的实现
文章目录 一.YModem协议简介 二.YModem的数据格式 1.起始帧的数据格式 2.数据帧的数据格式 3.结束帧的数据格式 4.文件传输过程 三.基于Ymodem协议串口升级程序的实现过程 1. ...
- STM32 CUbeIDE 使用Ymodem协议进行串口IAP升级
STM32 CUbeIDE 使用Ymodem协议进行串口IAP升级 1.Ymodem协议简介 2.Boodload程序 2.1 传输32K限制解决 3.APP程序 4.升级测试 5.工程文件下载 ...
- lin通信ldf文件解析_基于LIN协议的代码自动生成系统及方法_2014108531085_说明书_专利查询_专利网_钻瓜专利网...
技术领域 本发明属于汽车电子LIN网络通讯领域,公开了一种利用LDF文件自动生成LIN通讯软件代码的方法. 背景技术 目前汽车电子产品的软件开发逐渐向模块化.标准化.集成化.自动化发展.LIN通讯模块 ...
- Oracle(TNS)协议解析及C/C++代码解析
Oracle客户端和服务器使用TNS作为其数据交换协议. 它提供了一种对用户透明的层, 为不同的工业标准协议提供统一, 通用的接口. 基本上是TNS以这样的方式指定了端口1521上的会话是" ...
- STM32的升级--ICP/ISP/IAP以及Ymodem协议分析
资料下载 Ymodem协议传输过程分析 ICP/ISP/IAP 区别 ICP(In-Circuit Programing): 通过J-Link/SWD等下载器烧写程序,上位机需要借助其他硬件的参与才能 ...
最新文章
- linux shell sed 删除文件 前几行
- c语言将源文件拷贝到目的文件,C语言编译过程 简介和详解
- 【Golang 基础】Go 语言的程序结构
- 深入理解position:relative 与 position:absolute(divb相对于diva进行绝对定位)
- spingmvc 通过xml配置redis jedispol 有密码 通过xml配置redis中的 jedispool(有密码)
- git 如何提取已提交的文件_git取两次提交的文件列表,包含目录信息
- java8 lamada表达式
- java 中异步消息通知,ActivityMQ的基本使用
- 机顶盒系统升级服务器,服务器及其软件升级方法、IP机顶盒及其软件升级方法...
- 360壁纸图片API收录
- xshell的注册码
- Pygame 官方文档 - pygame.mixer
- div 空隙的解决办法
- ORcad Capture CIS元件库管理
- Android 常用RGB值以及中英文名称
- 免费申请国外大学edu教育邮箱安装微软office全家桶
- ZOJ 3199 Longest Repeated Substring
- 国乒28人出战匈牙利公开赛 新增混双项目受关注
- Android 状态栏工具类(实现沉浸式状态栏 / 变色状态栏)
- 跟着Cell学作图|9.PPI分析(GeNets数据库)