大家好,欢迎来到IT知识分享网。
YModem协议:
YModem协议是由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议。
下面先看下YModem协议传输的完整的握手过程:先看下图
ps:这图都块包浆了
SENDER:发送方。
RECEIVER:接收方。
第一步先由接收方,发送一个字符’C’
发送方收到’C’后,发送第一帧数据包,内容如下:
SOH 00 FF Foo.c NUL[123] CRC CRC
第1字节SOH:表示本包数据区大小有128字节。如果头为STX表示本包数据区大小为1024
第2字节00: 编号,第一包为00,第二包为01,第三包为02依次累加。到FF后继续从0循环递增。
第3字节FF: 编号的反码。 编号为00 对应FF,为01对应FE,以此类推。
第4字节到最后两字节:若第1字节为SOH时有128字节,为STX时有1024字节,这部分为数据区。“Foo.c” 文件名, 超级终端下,在文件名后还有文件大小。官方dome也是因为使用了这个文件大小进行比对。这就是为什么用SecureCRT中的YMODEM协议而无法正确传输的原因。在文件名和文件大小之后,如果不满128字节,以0补满。
最后两字节:这里需要注意,只有数据部分参与了效CRC验,不包括头和编码部分。
16位CRC效验,高字节在前,低字节在后。
接收方收到第一帧数据包后,发送ACK正确应答。
然后再发送一个字符’C’。
发送方收到’C’后,开始发送第二帧,第二帧中的数据存放的是第一包数据。
接收方收到数据后,发送一个ACK然后等待下一包数据传送完毕,继续ACK应答。直到所有数据传输完毕。
数据传输完毕后,发送方发EOT,第一次接收方以NAK应答,进行二次确认。
发送方收到NAK后,重发EOT,接收方第二次收到结束符,就以ACK应答。
最后接收方再发送一个’C’,发送方在没有第二个文件要传输的情况下,
发送如下数据
SOH 00 FF 00~00(共128个) CRCH CRCL
接收方应答ACK后,正式结束数据传输。
以上部分,为YMODEM协议的基本操作流程。
代码实现思路:
可以使用一个简单的状态机来处理YModem协议的升级过程。
状态机是一种设计模式,它允许对象在其内部状态改变时改变其行为。在这个例子中,状态机用于管理YModem文件传输的不同阶段。
状态机的关键部分包括:
- 状态变量:
Get_state()
函数返回当前的状态。这个状态变量决定了接收到不同YModem命令时函数的行为。 - 状态转换:函数中的
Set_state()
调用用于改变状态。例如,当接收到开始传输的信号时,状态从TO_START
转换为TO_RECEIVE_DATA
。 - 事件处理:函数通过检查
LH_UART1.UART_Flag
来确定是否接收到新的数据。当接收到数据时,它会根据当前状态和接收到的数据(如SOH
或EOT
)来执行不同的操作,并可能改变状态。 - 动作:根据当前状态和接收到的数据,函数会执行不同的动作,如发送确认命令(
ACK
或NACK
)、擦除Flash页面、烧录程序、设置更新标志等。
状态机的不同状态和转换大致如下:
TO_START
:初始状态,等待开始传输。TO_RECEIVE_DATA
:开始接收数据包。TO_RECEIVE_EOT2
:接收到第一个结束包(EOT)后,等待第二个结束包。TO_RECEIVE_END
:接收到第二个结束包,准备结束传输。
这个状态机的设计允许函数根据YModem协议的规范来处理文件传输的不同阶段,并且能够在出现问题时(例如CRC校验失败)采取适当的措施。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/155074.html