Ymodem协议是一种高效的文件传输协议,每包数据可达到1024字节
Ymodem协议是一种错误纠正协议。使用较大数据块的调制解调采用这种协议,以获得更高的工作效率。
采用Ymodem协议的解调器以1024字节数块发送数据。成功接收不会被确认。有错误的块被确认(NAK),
并重发。在批处理模式下,可以使用一个命令发送一些文件。使用循环冗余校验码作为错误检验的方式
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来填充
以具体例子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 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 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请求结束帧!