网上很多关于Ymodem协议的,有部分是错误的,以下是经过本人亲自编写的程序,测试可用。目前单片机作为接受端,用于IAP升级,发送还没写。另外对于终止传送也还没写,正常情况接收是完全没问题的。
划重点:《重复发送1024字节直到收到EOT开头数据,网上的错误点就在这里,搞了我很久,网上说的是不够128凑齐发SOH包,其实不是,是凑齐1024发STX包直到发EOT。》
平台:stm32f101v8 超级终端 keil
传输起来,效果是这样的!一般很快 如下图 2秒就7K了
首先超级终端中Ymodem协议是这样的,定义单片机位接受者,超级终端为发送者:
SOH开头: 128字节的数据,总包大小128+5,SOH即0x01
STX开头: 1024字节的数据,总包大小1024+5 ,STX即0x02
EOT开头: 单个字节,传输完成,总包大小1 ,EOT即0x04
/*YModem standard CMD*/
#define YMODEM_SOH (0x01)
#define YMODEM_STX (0x02)
#define YMODEM_EOT (0x04)
#define YMODEM_ACK (0x06)
#define YMODEM_NAK (0x15)
#define YMODEM_CAN (0x18)
#define YMODEM_C (0x43)
以下为交流顺序:
接受者:发送大写字母C,等待数据
发送者:发送ASCII中的SOH也就是01,后面是包序号00,包序号反码FF,文件名YG06_V0_1.bin,NULL,文件大小11212 bytes ,补齐111字节至128字节,CRC CRC是数据段的16位CRC校验码。总共此包是128+5=133字节。SOH
我的第一个包收到如下: 01 00 FF "YG06_V0_1.bin" NULL "11212" NULL[111] CRC CRC
接受者:发送大写字母ACK,发送大写字母C,等待数据
发送者:发送ASCII中的STX也就是02,后面是包序号01,包序号反码FE,1024字节数据,CRC CRC.总共此包是1024+5=1029字节。STX
我的第一个包收到如下: 02 01 FE DATA[1024] CRC CRC
接受者:ACK
发送者:STX包
接受者:ACK
发送者:STX包
.......
接受者:ACK
发送者:EOT
重复发送1024字节直到收到EOT开头数据,网上的错误点就在这里,搞了我很久,网上说的是不够128凑齐发SOH包,其实不是,是凑齐1024发STX包直到发EOT。