XMODEM协议
上位机是现实了XModem-CRC16和XModem-1K;
- XModem-CRC16使用CRC-16校验方式,数据长度为128字节
- XModem-1K使用CRC-16校验方式,数据长度为1024字节
XModem协议字段定义
缩写 | 十六进制 | 含义 |
---|---|---|
SOH | 0x01 | 数据包的大小为 128 bytes |
STX | 0x02 | 数据包的大小为 1024 bytes |
EOT | 0x04 | 传输结束 |
ACK | 0x06 | 应答 |
NAK | 0x15 | 非应答 |
CAN | 0x18 | 取消 |
C | 0x43 | 启动传输 |
XModem协议格式详解
XModem-CRC16
在XModem-CRC16的数据帧中使用128字节空间用来传输文件数据,帧格式如下:
协议头 | 帧序号 | 帧序号补码 | 数据 | CRC高8位 | CRC低8位 |
---|---|---|---|---|---|
SOH | 0x01 | 0xFE | data[128] | CRCH | CRCL |
- 协议头:SOH=0x01,表示这个数据帧包含128个字节数据;
- 帧序号、帧序号补码:0x01是表示帧序号,0xFE是它的取反,再下一帧数据就是0x02 0xFD,以此类推;
- 数据:存放了128字节的文件数据;
- CRC高8位:CRC-16校验数据的高8位;
- CRC低8位:CRC-16校验数据的低8位;
如果最后一帧剩余的数据小于128字节,则剩余空间全部用0x1A(Ctrl-Z)填充;
XModem-1K
在XModem-1K的数据帧中使用1024字节空间用来传输文件数据,帧格式如下:
协议头 | 帧序号 | 帧序号补码 | 数据 | CRC高8位 | CRC低8位 |
---|---|---|---|---|---|
STX | 0x01 | 0xFE | data[1024] | CRCH | CRCL |
- 协议头:STX=0x02,表示这个数据帧包含1024个字节数据;
- 帧序号、帧序号补码:0x01是表示帧序号,0xFE是它的取反,再下一帧数据就是0x02 0xFD,以此类推;
- 数据:存放了1024个字节的文件数据;
- CRC高8位:CRC-16校验数据的高8位;
- CRC低8位:CRC-16校验数据的低8位;
如果最后一帧剩余的数据小于1024字节,则剩余空间全部用0x1A(Ctrl-Z)填充;
XModem-CRC16文件传输示例
下面以传输一个文件为例来具体说明XModem文件传输过程。
- 文件名为:foo.c,文件大小为:356字节;
序号 | 发送方 | 接收方 |
---|---|---|
1 | - | C |
2 | STX 0x01 0xFE Data[128] CRC CRC | - |
3 | - | ACK |
4 | STX 0x02 0xFC Data[128] CRC CRC | - |
5 | - | NAK |
6 | STX 0x02 0xFC Data[128] CRC CRC | - |
7 | - | ACK |
8 | SOH 0x03 0xFB Data[100] CPMEOF[28] CRC CRC | - |
9 | - | ACK |
10 | EOT | - |
11 | - | ACK |
- 接收方发送C(这里C是告诉发送方我们要使用CRC-16的校验方式)给发送方,告诉发送方可以开始传输数据了,然后发送方就会发送文件数据给接收方了;
- 当接收方到正确的数据后返回ACK,不正确时返回NAK,此时发送方将会重新发送上一次的数据;
- 当文件传输完成后,发送方会发送EOT,表示文件发送完了,接收方返回ACK表示文件正式传输完成;
注意: 如果接收方不能接收文件后,可以发送CAN给发送方来取消文件传输。
XModem-1K文件传输示例
下面以传输一个文件为例来具体说明XModem文件传输过程。
- 文件名为:foo.c,文件大小为:3048字节;
序号 | 发送方 | 接收方 |
---|---|---|
1 | - | C |
2 | STX 0x01 0xFE Data[1024] CRC CRC | - |
3 | - | ACK |
4 | STX 0x02 0xFC Data[1024] CRC CRC | - |
5 | - | NAK |
6 | STX 0x02 0xFC Data[1024] CRC CRC | - |
7 | - | ACK |
8 | STX 0x03 0xFB Data[1000] CPMEOF[24] CRC CRC | - |
9 | - | ACK |
10 | EOT | - |
11 | - | ACK |
- 接收方发送C(这里C是告诉发送方我们要使用CRC-16的校验方式)给发送方,告诉发送方可以开始传输数据了,然后发送方就会发送文件数据给接收方了;
- 当接收方到正确的数据后返回ACK,不正确时返回NAK,此时发送方将会重新发送上一次的数据;
- 当文件传输完成后,发送方会发送EOT,表示文件发送完了,接收方返回ACK表示文件正式传输完成;
注意: 如果接收方不能接收文件后,可以发送CAN给发送方来取消文件传输。
YMODEM协议
YModem是XModem的升级版协议,两者最大的区别是YModem可以支持传输多个文件。
通常所说的YModem协议是指的YModem-1K,除此之外还有YModem-G,YModem-G 无需无错误通道的认可或当调制解调器自纠错时就可传送,但是一旦出现错误传送就会取消。,上位机没有实现这协议。
YModem协议字段定义
缩写 | 十六进制 | 含义 |
---|---|---|
SOH | 0x01 | 数据包的大小为 128 bytes |
STX | 0x02 | 数据包的大小为 1024 bytes |
EOT | 0x04 | 传输结束 |
ACK | 0x06 | 应答 |
NAK | 0x15 | 非应答 |
CAN | 0x18 | 取消 |
C | 0x43 | 启动传输 |
YModem协议格式详解
1.起始帧的数据格式
帧长=3字节数据首部+128字节数据+2字节CRC16校验码=133字节。它的数据结构如下:
协议头 | 帧序号 | 帧序号补码 | 文件名 | 文件大小 | 空 | CRC高8位 | CRC低8位 |
---|---|---|---|---|---|---|---|
SOH | 0x00 | 0xFF | filename | filezise | NUL | CRCH | CRCL |
- 协议头:SOH=0x01,表示这个数据帧包含128个字节数据;
- 帧序号、帧序号补码:表示传输的帧数,大于0xFF后从0x00重新开始,补码是了为了确保传输的正确性;
- 文件名:要传输的文件名,以’\0’结束;
- 文件大小:要传输的文件大小,用字符串表示,紧跟在文件名后面,例如要传输1234个字节的文件,那么就是:0x31 0x32 0x33 0x34 0x00;
- 空:除去文件名和文件大小,剩下的数据使用0填充;
- CRC高8位:CRC-16校验数据的高8位
- CRC低8位:CRC-16校验数据的低8位
2.数据帧的数据格式
在YModem的数据帧中使用1024字节空间用来传输文件数据,它跟起始帧格式差不多,如下:
协议头 | 帧序号 | 帧序号补码 | 数据 | CRC高8位 | CRC低8位 |
---|---|---|---|---|---|
STX | 0x01 | 0xFE | data[1024] | CRCH | CRCL |
- 协议头:STX=0x02,表示这个数据帧包含1024个字节数据;
- 帧序号、帧序号补码:0x01是表示帧序号,0xFE是它的取反,再下一帧数据就是0x02 0xFD,以此类推;
- 数据:存放了1024个字节的文件数据;
- CRC高8位:CRC-16校验数据的高8位;
- CRC低8位:CRC-16校验数据的低8位;
文件的最后一帧分三种特殊情况:
- 最后一帧剩余的数据大于128字节:使用STX的1024字节传输,但是剩余空间全部用0x1A(Ctrl-Z)填充;
- 最后一帧剩余的数据等于128字节:使用SOH的128字节传输;
- 最后一帧剩余的数据小于128字节:使用SOH的128字节传输,但是剩余空间全部用0x1A(Ctrl-Z)填充;
3.结束帧数据结构
YModem的结束帧数据也采用SOH的128字节数据帧,它的结构如下:
协议头 | 帧序号 | 帧序号补码 | 数据 | CRC高8位 | CRC低8位 |
---|---|---|---|---|---|
SOH | 0x00 | 0xFF | NUL[128] | CRCH | CRCL |
结束帧以SOH开头,表示后面数据大小为128字节,但128字节的数据部分不存放任何信息,即全部用00填充;结束帧的帧序号也认为是0x00 0xFF。
YModem文件传输示例
下面以传输两个文件为例来具体说明YModem文件传输过程。
- 第一个文件名为:foo.c,文件大小为:2148字节;
- 第二个文件名为:b.c,文件大小为:2024字节。
序号 | 发送方 | 接收方 |
---|---|---|
1 | C | |
2 | SOH 0x00 0xFF [0x66…0x63] 0x00 [0x32…0x38] 0x00 NUL[117] CRC CRC | - |
3 | - | ACK |
4 | - | C |
5 | STX 0x01 0xFE Data[1024] CRC CRC | - |
6 | - | ACK |
7 | STX 0x02 0xFC Data[1024] CRC CRC | - |
8 | - | NAK |
9 | STX 0x02 0xFC Data[1024] CRC CRC | - |
10 | - | ACK |
11 | SOH 0x03 0xFB Data[100] CPMEOF[28] CRC CRC | - |
12 | - | ACK |
13 | EOT | - |
14 | - | NAK |
15 | EOT | - |
16 | - | ACK |
17 | - | C |
18 | SOH 0x00 0xFF 0x62 0x2E 0x63 0x00 [0x32…0x34] 0x00 NUL[119] CRC CRC | - |
19 | - | ACK |
20 | - | C |
21 | STX 0x01 0xFB Data[1024] CRC CRC | - |
22 | - | ACK |
23 | STX 0x01 0xFB Data[1000] CPMEOF[24] CRC CRC | - |
24 | - | ACK |
25 | EOT | - |
26 | - | NAK |
27 | EOT | - |
28 | - | ACK |
29 | - | C |
30 | SOH 0x00 0xFF NUL[128] CRC CRC | - |
31 | - | ACK |
- 接收方发送C给发送方,告诉发送方可以开始传输数据了,接收方第一次收到C后会传输文件名和文件大小信息;
- 接收方在次发送C给发送方后,就正式开始文件内容的传输了;
- 当接收方到正确的数据后返回ACK,不正确时返回NAK,此时发送方将会重新发送上一次的数据;
- 当文件传输完成后,发送会发送EOT,接收方第一次收到EOT时应放回NAK,如果再次收到EOT,则返回ACK,这样做的目的是确保文件传输结束了,而不是其他干扰数据;
- 接收方接收完一个文件后,再次发送C给发送方,如果发送方还有待发送的文件,则会发送带有文件名和大小的SOH帧;如果发送方没有待发送的文件,则会发送SOH数据帧,其中128字节数据都是0x00。
注意: 如果接收方不能接收文件后,可以发送CAN给发送方来取消文件传输。