XModem是最早的文件传输协议之一,以每次传输128字节的速度传输文件,而YModem是基于XModem的改进传输协议,也是现在最常用的文件传输协议之一。相较于XModem,YModem的优点在于,它可以每次传输1024字节,传输的速度大大提升,且传输稳定。不仅如此,YModem协议还支持多文件同时传输。谱思各款控制器进行固件升级便是采用的该协议。
为了提升固件升级的效率以及让客户更加方便地使用谱思控制器,我们将固件升级写到python程序中,封装为一个脚本。如何将固件升级写到程序里呢?首先需要了解升级文件的传输过程。将两个485转换器并联到控制器的通讯端口,打开串口助手,在固件升级过程中就可以通过串口助手监控到数据传输的具体格式。通过监控的数据可以发现,第一步是给控制器发送回车符让控制器进入bootloader模式,而后的数据传输的过程便与YModem协议完全符合。数据监控除了可以验证数据传输规律以外,在程序编写出现bug时,还可以帮助我们快速地找到问题所在。
YModem协议是固件升级的重头戏,大致分为三个部分:起始帧、数据帧、结束帧。
起始帧传输的内容包括:帧头、帧序、升级文件的文件名、文件大小、帧尾,数据部分一共是128字节,写完文件大小后总字节不足128个字节需要写’00补齐’。其结构如下:
SOH num -num filename filesize nul crch crcl
帧头固定为SOH或STH,SOH=0x01,表示这帧数据有128字节的数据,当一帧数据有1024字节时,即用STH=0x02表示。num表示帧序,从’00’开始,-num为帧序的反码,也就是说’num’ + ‘-num’ = FF。filename为文件名,filesize为文件大小,filename和filesize都要以空字符’00’结束。CRC为校验码,需要注意的是YModem协议采用的是CRC16-CCITT欧洲版本的CRC校验。
数据帧真正开始进行升级文件的数据传输。将升级文件以每帧1024字节的大小进行切割,依次传输。其结构如下:
STH num -num data[1024] crch crcl
当最后一帧数据不足1024字节时,补’1A’即可。还有一种特殊情况,当最后一帧数据不足128字节时,仍补’1A’,此时的帧结构为:SOH num -num data[128] crch crcl。
结束帧传输的数据也是128字节,只是其传输的数据全为’00’,结构如下:
STH num -num nul[128] crch crcl
传输这条数据的目的在于告诉控制器升级文件全部传输结束啦!
在这个过程中需要注意两个问题:
1、CRC校验码的计算:CRC校验采用的是CRC16-CCITT,高位在前,低位在后。当校验码高位为00时,一定要非常注意,千万不要省略掉,否则升级过程中断,控制器就变砖头了。
2、对最后一帧数据的判断:判断条件一定要充足,小于128字节,等于128字节,大于128字节小于1024字节,等于1024字节,漏掉其中任何一个条件都可能导致升级失败。