YMODEM协议简介
YMODEM协议是一个文件传输协议,由Chuck Forsberg于上世纪90年代开发完成,通常用于资源受限的设备。
ST官方在STM32CubeHAL库中提供了一个IAP例程,其使用的便是YMODEM协议。这个协议有比较多的变种(YMODEM作者在其协议手册中提及),以至于大家的实现不太一样,本文以STM32CubeHAL库中IAP例程的实现为标准。
下面先对YMODEM协议进行介绍,然后进行代码实现和例程试验。
1. YMODEM协议简介
YMODEM协议的传输过程如下图所示(摘自YMODEM协议手册):
其中“sb foo.*
”指的是Linux中的sb命令,可在Linux终端执行 sb --help查看使用方法 上图中YMODEM协议传输的数据块是128字节,其实YMODEM协议还支持1024字节的数据块,或者128字节和1024字节混合模式。详情请查阅YMODEM协议手册。
SOH 表示本数据块大小为128字节
STX 表示本数据块大小为1024字节
本文中EOT指令仅有一次会话,即上图中的最后一次
2. 起始帧的数据格式
YMODEM的起始帧的数据块大小为128字节,传输的是文件名、文件大小、文件修改日期等信息,其中文件名和文件大小信息是必须的。128字节的剩余部分用空字符填充(也就是0)。
SOH 00 FF foo.c 3232 NUL[118] CRCH CRCL
SOH:表示本帧数据块大小为128字节
00:表示数据帧序号,初始是0,依次向下递增,FF是帧序号的取反
foo.c:是要传输的文件名,是ASCII字符串(以空字符结尾)
3232:表示文件的大小,是ASCII字符串(以空字符结尾)
NUL[118]:剩余部分用空字符填充
CRCH/L:表示16位CRC校验码的高8位与低8位
3. 数据帧的数据格式
YModem的数据帧的数据块大小可以是128字节或者1024字节。
// 128字节的数据块
SOH 01 FE data[128] CRCH CRCL
// 1024字节的数据块
STX 01 FE data[1024] CRCH CRCL
一般会使用1024字节的数据块进行传输,这样可以加快传输速度,如果最后文件数据不足1024字节,则将其拆分为128字节的数据块进行传输,如果拆分后有不足128字节的数据依然按照128字节的数据块进行传输,但是剩余空间全部用0x1A填充,以表示文件结束。
4. 结束帧数据结构
当文件传输结束时,除了发送EOT传输结束指令外,还需要发送一个结束帧。YModem的结束帧与起始帧的数据格式相同,数据块大小为128字节,但是结束帧的数据块要全用空字符填充。SOH 3A C5 NUL[128] CRCH CRCL
5. YMODEM协议实战
预备资源:
STM32开发板及下载器
IAP_Main,它实现了通过YMODEM协议传输文件和Flash操作
IAPBinaryTemplate,它是用来生成待升级bin文件的
YMODEM上位机,它实现了与STM32通过YMODEM传输文件,通过USART进行交互的功能
使用方法:
首先编译IAPBinaryTemplate项目得到bin文件,并将其放在YMODEM上位机的resources文件夹下
然后编译并烧写IAP_Main
最后编译启动YMODEM上位机,根据终端提示的菜单进行操作即可
6.相关资源链接
微信公众号文章不支持外链,所以小编特将本文相关资源链接放在这里,方便大家使用。
YMODEM官方协议文档:
https://github.com/FanHongchuang/JAVAYMODEMFORSTM32IAP/blob/master/doc/xymodem.pdf
IAP_Main:
https://github.com/FanHongchuang/STM32_IAP_Demo/tree/master/IAP_Main
IAP_Binary_Template:
https://github.com/FanHongchuang/STM32_IAP_Demo/tree/master/IAP_Binary_Template
YMODEM上位机:
https://github.com/FanHongchuang/JAVA_YMODEM_FOR_STM32_IAP