YModem 协议
【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
1 / 8