FavoriteLoading
0

YModem协议之SecureCRT实现

1.YMODEM 协议通信的 CRC16计算

YModem相关协议的spec 可以从这里下载:xymodem spec。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,紧接着是文件名称及其扩展名,以字符结束,然后是十进制的文件大小,文件大小信息也是以字符结束,后续内容以字符填充,最后两个字节是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,紧接着是文件名称及其扩展名,以字符结束,然后是十进制的文件大小,文件大小信息是以0x20字符结束,还有文件最后修改时间(1970/01/01/00秒开始的秒计数),后续内容以字符填充,最后两个字节是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 的性能卓越,速度最快。