Ymodem协议详解

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

状态机的关键部分包括:

  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校验失败)采取适当的措施。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值