背景
这里的Ymodem是YMODEM-1K(除此还有Ymodem-g(没有CRC校验,不常用)),经常使用在IAP固件升级中。是X-modem协议升级过来的,每一包数据可以达到1024字节,比X-modem高效很多。这个协议包括了文件的识别、传送的起止时间、错误的判断与纠正等内容,所以也可以较好的保正固件在传输的过程中的正确性。
帧头
- SOH 01H(modem 128数据帧头)
- STX 02H(Ymodem 1024数据帧头)
- EOT 04H(发送结束)
- ACK 06H(应答)
- NAK 15H(非应答)
- CAN 18H(取消发送)
握手
起始帧
帧结构:
Byte1 | Byte2 | Byte3 | Byte4~Byte (4+N* ) | Byte (4+N+1 )~Byte(4+N +1+M* ) | NULL | Byte 127 | Byte 128 |
---|---|---|---|---|---|---|---|
SOH | 0x00 | 0xFF | filename | filezise | 0x00 | CRC_H | CRC_L |
解析:
- Byte1
SOH = 0x01,起始数据帧只有128个字节 - Byte2
0x00表示数据帧序号,初始时0x00,下个时0x01 - Byte3
帧序号取反 - Byte4~Byte (4+N* )
N*表示文件文件名长度+1(文件名长度+结束符)
filename是传输文件的文件名,把ASCII转换成十六进制还要加个结束符0x00,例如abc.bin
,转换后是61 62 63 2e 62 69 6e 00
- Byte (4+N+1 )~Byte(4+N +1+M* )
M* 文件长度的ASCII转换成HEX后的字节数+1(结束符)
filezise是文件的大小,如果文件时1KB,则是1024Byte
,也是要ASCII转换成十六进制加结束符0x00的,31 30 32 34 00
- NULL
NULL是使用0x00填充起始帧128字节的其他字节 - Byte 127、Byte 128
CRC16校验,然后高8位在前,低8位在后
数据帧
帧结构:
Byte1 | Byte2 | Byte3 | Byte4~Byte1027 | Byte 1028 | Byte 1029 |
---|---|---|---|---|---|
STX | 0x01 | 0xFE | data[1024] | CRC_H | CRC_L |
解析:
- Byte 1
STX是0x02,表示这个帧数据部分包含1024个字节 - Byte 2
与起始帧一样表示帧序号,第二个数据帧则是0x02,其取反则是0xFD,第三帧则是0x03 - Byte 3
Byte 2 的取反 - Byte3~Byte1027
1024Byte的数据。 - Byte 1028 Byte 1029
CRC16校验,然后高8位在前,低8位在后
特殊情况
若文件最后剩余部分小于1024Byte,则拆分成128字节传输,还是不足之处使用0x1A填充。
参考Ymodem手册
结束帧
帧结构:
Byte1 | Byte2 | Byte3 | Byte4~Byte131 | Byte 132 | Byte 133 |
---|---|---|---|---|---|
SOH | 0x00 | 0xFF | 0x00 | CRC_H | CRC_L |
- Byte3~Byte131
全部使用0x00填充。