传输流程
数据包开始信号 | 发送序号 | 发送序号反码 | 数据区 | CRC高字节 | CRC低字节 |
---|---|---|---|---|---|
SOH/STX | 01 | FE | … | … | … |
1Byte | 1Byte | 1Byte | 128/1024Byte | 1Byte | 1Byte |
开启是由接收方开启传输,接收方发送一个字符'C',然后进入等待(SOH)状态,如果没有回应,就会超时退出。
发送方开始时处于等待过程中,等待字符'C'。发送方收到'C'后,发送第一帧数据包,内容如下:
SOH 00 FF Foo.c NUL[123] CRC CRC (Foo.c为文件名,NUL[123]补0)
进入等待(ACK)状态。
接收方收到第一帧数据包后,CRC校验满足,则发送ACK。
发送方接收到ACK,又进入等待“文件传输开启”信号,即重新进入等待“C”的状态。
上面接收方只是收到了一个文件名,现在正式开启文件传输,Ymodem支持128字节和1024字节一个数据包。128字节以(SOH)开始,1024字节以(STX)开始。
接收方又发出一个字符'C',开始准备接收文件。进入等待“SOH”或者“STX”状态。
发送方收到字符'C'后,开始发送第二帧,第二帧中的数据存放的是第一包数据。内容如下:
(SOH/STX)(01序号)(FE反码)(128/1024字节数据)(CRC校验),等待接收方“ACK”。
接收方收到数据后,发送一个ACK,然后等待下一包数据传送完毕,继续ACK应答。直到所有数据传输完毕。
数据传输完毕后,发送方发EOT,第一次接收方以NAK应答,进行二次确认。发送方收到NAK后,重发EOT,接收方第二次收到结束符,就以ACK应答。最后接收方再发送一个字符'C'开启另一次传输,发送方在没有第二个文件要传输的情况下,发送如下数据:SOH 00 FF 00~00(共128个) CRCH CRCL,接收方应答ACK后,正式结束数据传输。
标志码
字符 | ASCII码16进制 |
---|---|
SOH | 0x01 |
STX | 0x02 |
ACK | 0x06 |
NAK | 0x15 |
EOT | 0x04 |
C | 0x43 |
起始帧(133字节)
SOH + 00 + FF + filename + filesize + NULL + CRCH + CRCL
- 起始帧是文件传输发送端发的第一条重要消息.
- filename表示传输文件的文件名.
- filesize表示需要传输文件的大小.
- CRCH + CRCL 表示整条帧(去掉前三个字节)的CRC16校验.
数据帧格式
STX/SOH + [编号] + 编号的反码 + data[0] + data[1] + data[2] + … + CRCH + CRCL
- SOH 表示有128个字节, 有的也只用SOH传输数据. STX 表示有1024个字节.
- CRCH + CRCL 表示整条帧(去掉前三个字节)的CRC16校验. 如果传输最后一条字节不足128个字节, 则用1A填充
结束帧的数据格式
SOH + 00 + FF + NULL + NULL + … + NULL + CRCH + CRCL