YModem协议

【精选】YModem协议_geggegeda的博客-CSDN博客

YModem协议:

YModem协议是由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议。

Xmodem、Ymodem和Zmodem协议是最常用的三种通信协议。

Xmodem协议是最早的,传输128字节信息块。

Ymodem是Xmodem的改进版协议,具有传输快速稳定的优点。它可以一次传输1024字节的信息块,同时还支持传输多个文件。

平常所说的Ymodem协议是指的Ymodem-1K,除此还有Ymodem-g(没有CRC校验,不常用)。

YModem-1K用1024字节信息块传输取代标准的128字节传输,数据的发送回使用CRC校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应ACK信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接收。
 

 
  1. SOH = b'\x01'

  2. STX = b'\x02'

  3. EOT = b'\x04'

  4. ACK = b'\x06'

  5. NAK = b'\x15'

  6. CAN = b'\x18'

  7. STR_C = b'C'

起始帧的数据格式

YModem的起始帧并不直接传输文件的数据,而是将文件名文件大小放在数据帧中传输,它的帧长=3字节数据首部+128字节数据+2字节CRC16校验码=133字节。它的数据结构如下:

SOH 00 FF  Data[ filename 0x00 filezise  NUL[...]  ]   DataCrcH  DataCrcL

其中SOH=0x01,表示这个数据帧中包含着128个字节的数据(STX表示1024字节,初始帧只有128个),00表示数据帧序号,初始是0,依次向下排,FF是帧序号的取反,filename是要传输的文件名,如USTB_V3_1.0.1.26_NMEA.Bin,它在数据帧中的格式为:55 53 54 42 5F 56 33 5F 31 2E 30 2E 31 2E 32 36 5F 4E 4D 45 41 2E 42 69 6E 00,也就是把ASCII码转成十六进制,但是最后一定要在文件名后加上00,表示文件名的结束;filesize表示文件的大小,如上面的USTB_V3_1.0.1.26_NMEA.Bin大小是132KB,也就是135168Byte,转换成十六进制就是0x21000,它在数据帧中的格式就是32 31 30 30 30 00,也就是ASCII的“21000”,同样最后要加上00表示结束,NUL就是数据部分的128字节中除去文件名和文件大小占据的剩下的字节都用00填充,CRCH和CRCL分别表示16位CRC校验码的高8位与低8位。

数据帧的数据格式

    YModem的数据帧中会预留1024字节空间用来传输文件数据,它跟起始帧接收差不多,如下:

       STX  01  FE  Data[1024]   DataCrcH  DataCrcL

其中STX=0x02,表示这帧数据帧后面包含着1024字节的数据部分;01是表示帧序号,FE是它的取反,再下一帧数据就是02 FD,以此类推;data[1024]表示存放着1024字节的文件数据;CRCH与CRCL是CRC16检验码的高8位与低8位。

如果文件数据的最后剩余的数据在128~1024之前,则还是使用STX的1024字节传输,但是剩余空间全部用0x1A填充,如下结构:

STX 01 FE Data[[  ] [1A ... 1A]  CRCH CRCL

有一种特殊的情况:如果文件大小小于等于128字节或者文件数据最后剩余的数据小于128字节,则YModem会选择SOH数据帧用128字节来传输数据,如果数据不满128字节,剩余的数据用0x1A填充这是数据帧的结构就变成了:

文件大小小于128字节:                SOH 01 FE Data[ [ ] [1A ...1A]] DataCrcH  DataCrcL

文件最后剩余数据小于128字节:  SOH 01 FE Data[ [ ] [1A...1A]] DataCrcH  DataCrcL

结束帧数据结构

    YModem的结束帧数据也采用SOH的128字节数据帧,它的结构如下:

SOH 00 FF Data[NUL[128]] DataCrcH  DataCrcL

结束帧同样以SOH开头,表示后面跟着128字节大小的数据;结束帧的帧序也认为是00 FF;结束帧的128字节的数据部分不存放任何信息,即全部用00填充。

文件传输过程

       文件的传输过程,以具体的例子说明。把USTB_V3_1.0.1.26_NMEA.Bin,大小为135168Byte(16进制为0x21000,它在数据帧中的格式就是32 31 30 30 30 00)的文件作为传输的对象,则它的传输过程如下:

发送端                                                                              接收端       

 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<   C

SOH 00 FF [55 53…6E 00]" "[32…30 00]'' NUL[96] 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] CRCCRC >>>>>>>>>>>>>>>>>>>>>>>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<   ACK

流程

第一步先由接收方,发送一个字符'C', 发送方收到'C'后,发送第一帧数据包,内容如下:

SOH 00 FF Foo.c 0x00 NUL[123] CRC CRC

第1字节SOH:表示本包数据区大小有128字节。如果头为STX表示本包数据区大小为1024

第2字节00: 编号,第一包为00,第二包为01,第三包为02依次累加。到FF后继续从0循环递增。

第3字节FF: 编号的反码。 编号为00 对应FF,为01对应FE,以此类推。

第4字节到最后两字节:若第1字节为SOH时有128字节,为STX时有1024字节,这部分为数据区。“Foo.c” 文件名, 超级终端下,在文件名后还有文件大小。官方dome也是因为使用了这个文件大小进行比对。这就是为什么用SecureCRT中的YMODEM协议而无法正确传输的原因。

         在文件名和文件大小之后,如果不满128字节,以0补满。

最后两字节:这里需要注意,只有数据部分参与了效CRC验,不包括头和编码部分

16位CRC效验,高字节在前,低字节在后。

接收方收到第一帧数据包后,发送ACK正确应答。

然后再发送一个字符'C'。

发送方收到'C'后,开始发送第二帧,第二帧中的数据存放的是第一包数据。

接收方收到数据后,发送一个ACK然后等待下一包数据传送完毕,继续ACK应答。直到所有数据传输完毕。

数据传输完毕后,发送方发EOT,第一次接收方以NAK应答,进行二次确认。

发送方收到NAK后,重发EOT,接收方第二次收到结束符,就以ACK应答。

最后接收方再发送一个'C',发送方在没有第二个文件要传输的情况下,

发送如下数据

SOH 00 FF 00~00(共128个) CRCH CRCL

接收方应答ACK后,正式结束数据传输。

以上部分,为YMODEM协议的基本操作流程。


Ymodem 协议详解

1. Ymodem 帧格式

Ymodem 有两种帧格式,主要区别是信息块长度不一样。

在这里插入图片描述

1.1 帧头

帧头表示两种数据帧长度,主要是信息块长度不同。
在这里插入图片描述

1.2 包序号

数据包序号只有1字节,因此计算范围是0~255;对于数据包大于255的,序号归零重复计算。

1.3 帧长度

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

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

1.4 校验

Ymodem采用的是CRC16校验算法,校验值为2字节,传输时CRC高八位在前,低八位在后;CRC计算数据为信息块数据,不包含帧头、包号、包号反码。

2.Ymodem握手信号

握手信号由接收方发起,在发送方开始传输文件前,接收方需发送YMODEM_C (字符C,ASII码为0x43)命令,发送方收到后,开始传输起始帧。

3.Ymodem起始帧

Ymodem起始帧并不直接传输文件内容,而是先将文件名和文件大小置于数据帧中传输;起始帧是以SOH 133字节长度帧传输,格式如下。

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

4.Ymodem数据帧

Ymodem数据帧传输,在信息块填充有效数据。

帧头 包号 包号反码 有效数据 校验高位 校验低位SOH/STX PN XPN DATA CRC-H CRC-L
  传输有效数据时主要考虑的是最后一包数据的是处理,SOH帧和STR帧有不同的处理。

【1】对于SOH帧,若余下数据小于128字节,则以0x1A填充,该帧长度仍为133字节。

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

●余下数据等于1024字节,以1029长度帧发送;
  ●余下数据小于1024字节,但大于128字节,以1029字节帧长度发送,无效数据以0x1A填充。
  ●余下数据等于128字节,以133字节帧长度发送。
  ●余下数据小于128字节,以133字节帧长度发送,无效数据以0x1A填充。

5.Ymodem结束帧

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

在这里插入图片描述

6.Ymodem命令

在这里插入图片描述

======================================================================================================

超级终端 SecureCRT 可以按照Ymoden 协议发送文件.目前在单片机IAP固件升级模式中常常利用超级终端的Ymodem 协议发送新固件包实现用户自定义Bootload 功能。

Ymodem协议是一种发送并等待的协议。即发送方发送一个数据包以后,都要等待接收方的确认。如果是ACK信号,则可以发送新的包。如果是NAK信号,则重发或者错误退出。

2、文件传输过程

文件传输过程的开启:

(1)开启是由接收方开启传输,它发一个大写字母C开启传输。然后进入等待(SOH)状态,如果没有回应,就会超时退出。然后继续发送大写字母C等待传输。

(2)发送方开始时处于等待过程中,等待C。收到C以后,发送(SOH)数据包开始信号,发送序号(00),补码(FF),“文件名”,“空格”“文件大小”“除去序号外,补满128字节”,CRC校验两个字节。进入等待(ACK)状态。

(3)接收方收到以后,CRC校验满足,则发送ACK。发送方接收到ACK,又进入等待“文件传输开启”信号,即重新进入等待“C”的状态。准备接收下一个包。

Ymodem 协议中第一包是传输文件信息包,一般采用128字节(1024字节,也可以实现,不过比较浪费资源)

一个完整包数据内容(SOH模式为例)为 包头(3字节)+ 数据段(128字节)+ CRC16校验码(2字节)。所以整包长度是128+5 =133字节,现举例如下(16进制):

01 00 FF 41 42 43 2E 62 69 6E 00 31 30 32 34 20 00 00 ...... 09 E8

第1字节 : 01  表示SOH模式,此包数据段大小为128字节,如果该位置是02,表示STX模式,此包数据段大小为1024字节。

第2字节: 00 包序列号为0,以后发送或接收的包序列号要依次递增。

第3字节 : FF 包序列号的补码(与第2字节00对应)。在Ymodem接收中会对第2,第3字节做检验。所以这两个字节数据要按照协议保持一致。 

第4字节到第131字节:数据段内容, 41 42 43 2E 62 69 6E 表示文件名(ASCII码 ABC.bin), 00 为文件名结束标志。31 30 32 34 表示文件大小 (ASCII码 1024字节), 20(ASCII码  空格符 '\0')为文件大小结束标志。此后到数据段的128字节全部填 00.

第132,133字节 : 09 E8 为CRC16校验码,此校验码只计算数据段128字节内容,不计算包头的3字节。此处09 E8 只是举例。

(4)文件发送完以后,发送方发出一个“EOT”信号,接收方也以“ACK”回应。

然后接收方会再次发出“C”开启另一次传输,若接着发送方会发出一个“全0数据包”,接收方回应“ACK”后,本次通信正式结束。

注意:“全0数据包”,包头并不为 0, 包头数据可写 01 00 FF. 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值