1.协议简介

Ymodem协议是一种高效的文件传输协议,每包数据可达到1024字节

Ymodem协议是一种错误纠正协议。使用较大数据块的调制解调采用这种协议,以获得更高的工作效率。

采用Ymodem协议的解调器以1024字节数块发送数据。成功接收不会被确认。有错误的块被确认(NAK),

并重发。在批处理模式下,可以使用一个命令发送一些文件。使用循环冗余校验码作为错误检验的方式

Ymodem协议的基本流程

YMODEM协议的基本操作流程

数据包开始信号

发送序号

发送序号补码


数据区

CRC高位

CRC低位

SOH/STX

01

FE

....

....

....

1Byte

1Byte

1Byte

128/1024Byte

1Byte

1Byte

起始帧的数据格式:

Ymodem的起始帧并不直接传输文件的数据,而是将文件名与文件大小放在数据帧中传输。

帧长 = 3字节数据首部+128字节数据+2字节CRC校验码=133字节

数据结构如下:

SOH   00   FF   filename[]   filesize[]   NULL[]   CRCH   CRCL

其中SOH=0x01,表示这个数据帧中包含着128字节的数据部分;在SOH后面的00 FF,00表示数据帧序号,因为是起始帧,所以它的帧序为00,至于FF,它是帧序的取反,YModem特地这么做是为了给数据是否正确提供一种判断依据,通过判断这两个字节是否为取反关系,就可以知道数据是否传输出错;filename[ ]就是文件名,如文件名foo.c,它在数据帧中存放格式为:66 6F 6F 2E 63 00,一定要在文件名最后跟上一个00,表示文件名结束;filesize[ ]就是文件大小,如上面的foo.c的大小为1KByte,即1024Byte,需要先将它转化成16进制,即0x400,所以它在数据帧的存放格式为:34 30 30 00,即“400”,同样的文件大小最后需要跟上00,表示结束;NUL[ ]表示剩下的字节都用00填充,数据部分大小为128字节,除去文件名与文件大小占用的空间外,剩余的字节全部用00填充;CRCH CRCL分别表示16位CRC校验码的高8位与低8位。

数据帧的数据格式:

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

STX   01   FE   data[1024]   CRCH   CRCL

其中STX=0x02,表示这帧数据帧后面包含着1024字节的数据部分;STX后面的01 FE,01表示第一帧数据帧,FE则是它的取反,当然如果是第二帧数据的话就是:01 FD;data[1024]表示存放着1024字节的文件数据;CRCH与CRCL是CRC16检验码的高8位与低8位。

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

如果文件大小小于等于128字节,或者文件数据最后剩余的数据小于128字节,则Ymodem会选择SOH数据帧用128字节来传输数据,如果数据不满128字节的部分用0x1A来填充

2.文件的传输过程

以具体例子foo.c举例,大小为4196字节的文件为传输对象,则它的传输过程如下:

发送端                                                                               接收端
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C
   
   SOH 00 FF "foo.c" "1064" NUL[118] CRC CRC >>>>>>>
   
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
   
   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
   
   STX 05 FA data[100] 1A[28] CRC CRC >>>>>>>>>>>>>>
   
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
   
   EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<NAK
   
   EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ACK
   
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C
   
   SOH 00 FF NUL[128] CRC CRC >>>>>>>>>>>>>>>>>>>>>>
   
   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK

 

YModem的传输过程就是上面所示。但是上面传输过程中存在许多通信信号,它们的数值与意义如下表所示:

 符号

 数值

 含义

 SOH

 0x01

 128字节数据包

 STX

 0x02

 1024字节数据包

 EOT

 0x04

 结束传输

 ACK

 0x06

 回应

 NAK

 0x15

 不回应

 CA

 0x18

 传输中止

 C

 0x43

 请求数据包

还是有几点需要说明下:

1)EOT信号由发送端发送

2)CA中止传输信号也有发送端发送

3)C的含义在英文的数据手册上的意思有点难以理解,我个人理解成请求数据包,如开始传输的发送C请求起始帧数据,然后再发送C请求文件数据帧,最后有发送一次C请求结束帧!