YMODEM 协议的两种不同实现【原创】 1 .YMODEM 协议通信的 CRC16计算 YMODEM 支持(128 + 5)字节小数据包和 (1024 + 5)字节大数据包,只有128字节和1024字节数据参与CRC16计算。 其中小数据包以 SOH(0x01)开始,第二、三字节分别是序号,序号反码,从第四字节开始计算,计算字节数为128,最后两个字节为CRC16。 大数据包以 STX(0x02)开始,第二、三字节分别是序号,序号反码,从第四字节开始计算,计算字节数为1024,最后两个字节为CRC16。 2. YMODEM 协议信息格式简要说明 对于超级终端(hypertrm),它实现的 YMODEM 协议信息格式如下: (1) 文件信息包的格式 (以 SOH(0x01)开始) 第一个通信数据包第一字节是 SOH(0x01),表明它是(128 + 5)小数据包,这个包是文件信息,其中第二字节是 数据包序号 0x00,第三字节是数据包序号反码 0xFF,紧接着是文件名称及其扩展名,以\0字符结束,然后是十进制的文件大小, 文件大小信息也是以\0字符结束,后续内容以\0字符填充,最后两个字节是CRC16(CRC16_Hi + CRC16_Lo)。 需要注意的是,这个文件信息包和SecureCRT软件的文件信息包有所差异(SecureCRT软件可以设定133 或 1029 两种不同大小的 文件信息包,而且文件信息包还含有文件修改记录信息)。 (2) 正文数据包格式 a.正文数据包的序号 YMODEM 协议正文数据包的序号从01开始,到FF结束,然后重新从00开始。YMODEM 协议文件信息包和正文数据包序号都是1个字节, 我认为它是有缺陷的,举一个例子说,西门子的某个通讯协议,数据包序号是两个字节,可以实现65536个数据包序号各不相同。 b.正文数据包的一般格式(大数据包) 对于超级终端,YMODEM 协议正文首先考虑发送(1024 + 5)字节的大数据包,其中第一个字节是数据包类型 STX(0x02), 第二字节是数据包序号,第三字节是数据包序号反码,接着是数据内容及0x1A填充(如果字节数不够),最后两个字节是CRC16。 接收方如果没有大内存,扇区写入缓冲,累计收满一个扇区(4096bytes/16KB/64KB/128KB),才写入FLASH。 正文数据内容一般是以 STX(0x02)开头的大数据包,但也有例外如下: c.正文数据包的小数据包特例一 文件字节数小于或等于128字节,则按(128 + 5)字节的小数据包发送。 其中第一个字节是 SOH(0x01),第二字节是数据包序号,第三字节是数据包序号反码,紧接着是正文内容, 后续内容以0x1A 字符填充,最后两个字节是CRC16。 d.正文数据包的小数据包特例二 文件字节数大于1024字节,正文通信以(1024 + 5)字节的大数据包发送,如果最后一个数据包的字节数小于或等于128字节, 则按(128 + 5)字节的小数据包发送。 在这种情况下,最后一个数据包的第一个字节是 SOH(0x01),第二字节是数据包序号,第三字节是数据包序号反码, 紧接着是正文内容,后续内容以0x1A 字符填充,最后两个字节是CRC16。接收方扇区写入缓冲加上最后一个小数据包,也不会满。 e.正文数据包的大数据包特例 需要强调的一个情况是,如果最后一个数据包的字节数大于128字节,且小于或等于1024字节,则按(1024 + 5)字节的大数据包发送。 和其它(1024 + 5)字节的大数据包一样,第一个字节是 STX(0x02),第二字节是数据包序号,第三字节是数据包序号反码,紧接着是正文内容。 不同的地方是如果正文内容小于1024字节,则以0x1A字符填充。最后两个字节是CRC16。 值得注意的是,这种最后一个数据包的字节数大于128字节,且小于或等于1024字节的特例,超级终端(hypertrm)和SecureCRT软件的处理方式不同, 后续会详细介绍。 对于SecureCRT,它实现的 YMODEM 协议信息格式如下: 如果选择了128字节的数据包,则全部按照133字节的包来发送,这个特例,传输效率不是很高。 但小数据包对USB1.1通信的带宽利用率比较高,只需要3帧USB数据包,就传输133字节,减少了出错的概率,可实现高波特率通信。 在做bootloader时,可以采用小数据包,影响速度是 FLASH 写入,而不是通信。 如果选择了1024字节的数据包,该软件的协议实现如下: (1) 文件信息包 (以 STX(0x02)开始) 第一个通信数据包第一字节如果是STX(0x02),则表明它是大数据包,这个包是文件信息,其中第二字节是数据包序号 0x00, 第三字节是数据包序号反码 0xFF,紧接着是文件名称及其扩展名,以\0字符结束,然后是十进制的文件大小, 文件大小信息是以0x20字符结束,还有文件最后修改时间(1970/01/01/00秒开始的秒计数),后续内容以\0字符填充,最后两个字节是CRC16。 (2) 正文数据包 a.正文数据包的序号 YMODEM 协议正文数据包的序号从01开始,到FF结束,然后重新从00开始。文件较大时,数据包序号会重复计数到0x00。 b.正文数据包的一般格式(大数据包) SecureCRT 实现的 YMODEM 协议,如果选择了1024字节,在发送文件信息包之后,正文数据也首先考虑发送(1024 + 5)字节的大数据包, 其中第一个字节是数据包类型,一般是 STX(0x02),第二字节是数据包序号,第三字节是数据包序号反码,接着是数据内容及 0x1A填充(如果字节数不够)。最后两个字节是CRC16。 SecureCRT 实现的 YMODEM 协议,如果选择了1024字节,内容一般是以 STX(0x02)开头的大数据包,但也有例外如下: c.正文小数据包的特例之一(小数据包) 文件字节数小于1024字节,则按(128 + 5)字节的小数据包发送。其中第一个字节是 0x01(SOH), 第二字节是数据包序号,第三字节是数据包序号反码,紧接着是正文内容,后续内容以0x1A 字符填充,最后两个字节是CRC16。 在这种情况下,数据包的序号最大值小于8(128 * 8 = 1024)。 d.正文小数据包的特例之二(小数据包) 文件字节数大于1024字节,正文通信以1024字节的包发送,如果最后一个数据包的字节数小于1024字节, 则全部按(128 + 5)字节的小数据包发送,这个情况和超级终端(hypertrm)的处理方式不同。 在这种情况下,最后一个数据包的第一个字节是 0x01(SOH),第二字节是数据包序号,第三字节是数据包序号反码, 紧接着是正文内容,后续内容以0x1A 字符填充,最后两个字节是CRC16。 在开发汽车电子底层bootloader时,如果使用了通用异步串口通讯,建议兼容超级终端(hypertrm)和SecureCRT这两种软件。 如果有软硬件自主开发的能力,还可以兼容更多的通信协议,例如汽车电子CCP/UDS协议等。 SecureCRT软件可以批处理传输多个文件,而超级终端(hypertrm)没有这个功能,SecureCRT 的性能卓越,速度最快。 参考资料: http://www.mcu.so/bootloader/YMODEM file transfer protocol.xlsx