Ymodem协议说明
模块的固件烧录过程,由Term(发送方)发送固件文件,模块(接收方)接收并写入MCU,期间使用的数据传输协议是ymodem协议。
一、概述
ymodem协议是一种发送并等待的协议,即发送方发送一个数据包以后,都要等待接收方的确认。如果是ACK信号,则继续发送新的包;如果是NAK信号,则重发该包或者错误退出。
二、固件传输过程
根据协议要求,固件传输过程由2个部分组成:
1.传输文件名。
2.传输文件。
三、接收方接收文件过程
文件接收过程具体步骤总结如下:
1.由模块(接收方)开启传输,即接收方发送大写字母‘C’开启传输,并进入等待状态。
2.Term(发送方)收到‘C’后,开始发送数据包,格式如下:
开始信号(SOH)+ 序号(00H)+ 补码(FFH)+ 文件名 + 空格 + 文件大小 + 补满128字节(从文件名处开始计算)+ CRC校验(2字节)
之后进入等待ACK状态。
3.模块(接收方)接收数据包之后,验证该包中的“序号(00H)”和“补码(FFH)”之间确实互为补码,则认为接收正确,提取“文件名”和“文件大小”,否则进入出错处理。
如果“文件大小”满足MCU要求,则发送ACK。如果“文件大小”大于MCU要求,则发送2个‘CA’终止传输。
4.至此,文件传输过程完成了文件名的传送,之后正式开启文件传输。同样,由模块(接收方)发送‘C’,开启传输。
5.Term(发送方)收到‘C’后,开始发送数据包,格式如下:
开始信号(SOH)+ 序号(01H)+ 补码(FEH)+ 128字节数据 + CRC校验(2字节)
或
开始信号(STX)+ 序号(01H)+ 补码(FEH)+ 1024字节数据 + CRC校验(2字节)
以上2种格式可任意选用。其中,“序号”依据数据包的数量逐包累加,由发送方确定。每发送完一包,发送方就等待ACK回应。
6.模块(接收方)收到一包数据后,同样通过验证该包中的“序号”和“补码”之间确实互为补码,则认为接收正确,否则进入出错处理。
7.如果模块(接收方)发现收到的数据包中的“序号”出现异常,即不连续或发生跳变,则发送NAK回应。
8.模块(接收方)确认数据包正确无误后,即将该包数据写入MCU,之后发送ACK,等待接收下一包数据。如果数据写入MCU的过程出现错误,则模块发送2个‘CA’终止传输。
9.当文件全部传输完成后,Term(发送方)发出一个‘EOT’信号。
10.模块(接收方)收到‘EOT’后,也以ACK回应。
11.Term(发送方)收到ACK后,发送一包数据内容为128个0的数据包,格式如下:
开始信号(SOH)+ 序号 + 补码 + 128个0 + CRC校验(2字节)
12.模块接收后,回应ACK,完成整个传输过程。
四、发送方发送文件过程
由于文件传输过程是由接收方发起的,发送方需要事先给出发送请求,操作如下:
首先控制模块运行booloader程序,然后Term发送‘1’,即通知模块即将向其下载固件。模块收到通知后会回应‘C’开启传输。
文件发送过程具体步骤总结如下:
1.Term(发送方)收到‘C’后,将文件名和文件大小打包成一包数据并发送,格式如下:
开始信号(SOH)+ 序号(00H)+ 补码(FFH)+ 文件名 + 空格 + 文件大小 + 补满128字节(从文件名处开始计算)+ CRC校验(2字节)
发送之后,Term等待接收方应答。
2.模块(接收方)收到数据包后,校验有效会发送ACK应答,并继续发送‘C’,开启文件传输。
3.Term(接收方)收到ACK后,等待接收‘C’,以开始发送数据包。根据设置,可选择下面2种格式:
开始信号(SOH)+ 序号(01H)+ 补码(FEH)+ 128字节数据 + CRC校验(2字节)
或
开始信号(STX)+ 序号(01H)+ 补码(FEH)+ 1024字节数据 + CRC校验(2字节)
其中“序号”依据数据包的数量逐包累加,由发送方确定。每发送完一包,发送方就等待ACK回应。
4.当文件数据全部发送完成后,Term(发送方)将发送‘EOT’,表示文件发送完成。
5.模块(接收方)收到‘EOT’后,返回ACK应答。
6.Term(发送方)收到ACK应答后,将发送一包数据内容为全0的数据。格式如下:
开始信号(SOH)+ 序号 + 补码 + 128个0 + CRC校验(2字节)
7.模块(接收方)返回ACK应答,结束整个传输过程。
五、说明
1.从传输过程的步骤中可以看出,有些操作并不是严格按照ymodem协议的要求来执行的。其中:模块(接收方)收到一包数据后,并没有验证CRC是否正确,而是通过验证“序号”和“补码”间的数学关系是否正确,来确认该包数据是否有效。
2.固件传输过程中,一旦发生错误(数据传输出错、“序号”出错、“序号”和“补码”间计算错误等),模块(接收方)将重启固件传输过程,即重新发送‘C’。
3.如果模块(接收方)收到的数据包中的序号出错(不连续),则回应NAK,Term(发送方)收到NAK后,会重发该包。若发送方连续若干次收到NAK,则终止传输。
4.固件传输过程中,如果模块(接收方)连续若干次发生错误,则接收方将发送2个‘CA’终止传输。Term(发送方)收到‘CA’后,进入终止传输过程,即同样发送2个‘CA’后结束。
六、使用符号
#define SOH (0x01) // 128字节数据包起始标志
#define STX (0x02) // 1024字节数据包起始标志
#define EOT (0x04) // 文件传输结束标志
#define ACK (0x06)
#define NAK (0x15)
#define CA (0x18)
Ymodem协议说明的更多相关文章
- YModem协议
源:YModem协议 YModem协议: YModem协议是由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议. 下面先看下YModem协议传输的完整的握手过程: ...
- stm32 Bootloader设计(YModem协议) (转)
源:stm32 Bootloader设计(YModem协议) 相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootlo ...
- ymodem协议c实现(转)
源:ymodem协议c实现 /****************************************Copyright (c)******************************** ...
- Ymodem协议(参考STM32)
相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootload设计.所以就仔细的去了研究了一翻.以前都是用的stm32官 ...
- ZYNQ使用ymodem协议传输文件
SDK: V2014.4 协议: Ymodem 工具: USB转UART转接线.xshell6软件 可实现各种文件传输,大小不限,只是速度很慢 参考原代码如下: /****************** ...
- python调用Moxa PCOMM Lite通过串口Ymodem协议发送文件
本文采用python 2.7编写. 经过长期搜寻,终于找到了Moxa PCOMM Lite.调用PCOMM.DLL可以非常方便的通过串口的Xmodem.Ymodem.Zmodem等协议传输文件,而无需 ...
- Kermit,Xmodem,1K-Xmodem,Ymodem,Zmodem传输协议小结
来自:http://blog.163.com/czblaze_3333/blog/static/208996228201272295236713/ Kermit协议 报文格式: 1. MA ...
- STM32 Bootloader基于ymodem传输协议串口IAP升级详解
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 文章目录 1 预备知识 2 Bootloader 2.1 启动流程 2.2 校验跳转地址是否有效 ...
- STM32F103/429串口IAP+Ymodem升级
起因: 串口IAP升级在正点原子的例程中有讲解,正点原子的方法是:在RAM中开辟一个120K的数据空间,用来存放bin文件,bin文件通过串口一次性发送到单片机,然后再实现程序的跳转.但是这种方法在实 ...
随机推荐
- Git使用之(pathspec master did not match any file(s) known to git)
一 问题概述 今天在工作中遇到一个问题,使用很久的一个local git repository,里面只有develop分支,那么现在想将分支切换到master分支,问题来了,在切换到master分支时 ...
- Tornado异步非阻塞的使用以及原理
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado ...
- 二、易语言 api 相关
1. 取窗口句柄 对应的api: FindWindow (寻找顶级窗口) 2.取窗口矩形(位置) 对应的api: GetWindowRect(取窗口矩形) 3.取窗口标题 对应的api: Get ...
- 和2018年年初做管理系统的不同(vuex)
从2017年底开始做公司批改后台系统(服务内部人员对熊猫小课用户的作业进行批改.对批改员工资结算等)到教务系统(服务于内部人员对熊猫小课等移动端产品的内容进行配置等).ai-boss系统(服务于内部人 ...
- socket开发总结
1.connect 阻塞socket connect时会等待返回结果,等于0表示成功,小于0表示失败. 非阻塞socket connect时会立刻返回结果,等于0表示成功,小于0且errno == E ...
- 【原创】Windows上应用程序报错常用分析方法总结
在日常使用Windows的过程中,经常会遇到应用程序不能正常启动.关闭等使用问题.对于Windows来说,解决这些问题的方法比较多,大多时候我们可以通过百度或谷歌搜索来解决.但更多的时候,我们需要找出 ...
- python(list、字典、元组、字符串方法、文件读写)草稿
1.list 定义list a = [] 添加元素 a.append('xx') #在list末尾添加 a.insert(0,'abc') #在指定某位置添加元素.指定的下标不存在就在末尾添加 ...
- React基础概念
Hello Wrold ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('root') ); ...
- 字符串排序--string类的使用
最近帮他们做了一个简单的c++的题目,以前做过,当时是借鉴的别人的代码,现在也忘得差不多了,不过思路还有,现在正好可以再温习一下. 题目要求如下: 先输入你要输入的字符串的个数.然后换行输入该组字符串 ...
- 种类并查集(洛谷P2024食物链)
题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...