Ymodem协议详解

Ymodem协议详解若第 1 字节为 SOH 时有 128 字节 为 STX 时有 1024 字节 这部分为数据区

大家好,欢迎来到IT知识分享网。

YModem协议:

         YModem协议是由XModem协议演变而来的,每包数据可以达到1024字节,是一个非常高效的文件传输协议。

         下面先看下YModem协议传输的完整的握手过程:先看下图

ps:这图都块包浆了

Ymodem协议详解

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文件传输的不同阶段。

状态机的关键部分包括:

  1. 状态变量Get_state()函数返回当前的状态。这个状态变量决定了接收到不同YModem命令时函数的行为。
  2. 状态转换:函数中的Set_state()调用用于改变状态。例如,当接收到开始传输的信号时,状态从TO_START转换为TO_RECEIVE_DATA
  3. 事件处理:函数通过检查LH_UART1.UART_Flag来确定是否接收到新的数据。当接收到数据时,它会根据当前状态和接收到的数据(如SOHEOT)来执行不同的操作,并可能改变状态。
  4. 动作:根据当前状态和接收到的数据,函数会执行不同的动作,如发送确认命令(ACKNACK)、擦除Flash页面、烧录程序、设置更新标志等。

状态机的不同状态和转换大致如下:

  • TO_START:初始状态,等待开始传输。
  • TO_RECEIVE_DATA:开始接收数据包。
  • TO_RECEIVE_EOT2:接收到第一个结束包(EOT)后,等待第二个结束包。
  • TO_RECEIVE_END:接收到第二个结束包,准备结束传输。

这个状态机的设计允许函数根据YModem协议的规范来处理文件传输的不同阶段,并且能够在出现问题时(例如CRC校验失败)采取适当的措施。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/155074.html

(0)
上一篇 2025-02-21 19:25
下一篇 2025-02-21 19:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信