• Ymodem协议说明


     

        模块的固件烧录过程,由Term(发送方)发送固件文件,模块(接收方)接收并写入MCU,期间使用的数据传输协议是ymodem协议。

    一、概述

        ymodem协议是一种发送并等待的协议,即发送方发送一个数据包以后,都要等待接收方的确认。如果是ACK信号,则继续发送新的包;如果是NAK信号,则重发该包或者错误退出。

    二、固件传输过程

        根据协议要求,固件传输过程由2个部分组成:

        1.传输文件名。

        2.传输文件。

    三、接收方接收文件过程

        文件接收过程具体步骤总结如下:

        1.由模块(接收方)开启传输,即接收方发送大写字母‘C’开启传输,并进入等待状态。

        2.Term(发送方)收到‘C’后,开始发送数据包,格式如下:

        开始信号(SOH)+ 序号(00H)+ 补码(FFH)+ 文件名 + 空格 + 文件大小 + 补满128字节(从文件名处开始计算)+ CRC校验(2字节)

        之后进入等待ACK状态。

        3.模块(接收方)接收数据包之后,验证该包中的“序号(00H)”和“补码(FFH)”之间确实互为补码,则认为接收正确,提取“文件名”和“文件大小”,否则进入出错处理。

        如果“文件大小”满足MCU要求,则发送ACK。如果“文件大小”大于MCU要求,则发送2个‘CA’终止传输。

        4.至此,文件传输过程完成了文件名的传送,之后正式开启文件传输。同样,由模块(接收方)发送‘C’,开启传输。

        5.Term(发送方)收到‘C’后,开始发送数据包,格式如下:

        开始信号(SOH)+ 序号(01H)+ 补码(FEH)+ 128字节数据 + CRC校验(2字节)

        或

        开始信号(STX)+ 序号(01H)+ 补码(FEH)+ 1024字节数据 + CRC校验(2字节)

        以上2种格式可任意选用。其中,“序号”依据数据包的数量逐包累加,由发送方确定。每发送完一包,发送方就等待ACK回应。

        6.模块(接收方)收到一包数据后,同样通过验证该包中的“序号”和“补码”之间确实互为补码,则认为接收正确,否则进入出错处理。

        7.如果模块(接收方)发现收到的数据包中的“序号”出现异常,即不连续或发生跳变,则发送NAK回应。

        8.模块(接收方)确认数据包正确无误后,即将该包数据写入MCU,之后发送ACK,等待接收下一包数据。如果数据写入MCU的过程出现错误,则模块发送2个‘CA’终止传输。

        9.当文件全部传输完成后,Term(发送方)发出一个‘EOT’信号。

        10.模块(接收方)收到‘EOT’后,也以ACK回应。

        11.Term(发送方)收到ACK后,发送一包数据内容为128个0的数据包,格式如下:

        开始信号(SOH)+ 序号 + 补码 + 128个0 + CRC校验(2字节)

        12.模块接收后,回应ACK,完成整个传输过程。

    四、发送方发送文件过程

        由于文件传输过程是由接收方发起的,发送方需要事先给出发送请求,操作如下:

        首先控制模块运行booloader程序,然后Term发送‘1’,即通知模块即将向其下载固件。模块收到通知后会回应‘C’开启传输。

        文件发送过程具体步骤总结如下:

        1.Term(发送方)收到‘C’后,将文件名和文件大小打包成一包数据并发送,格式如下:

        开始信号(SOH)+ 序号(00H)+ 补码(FFH)+ 文件名 + 空格 + 文件大小 + 补满128字节(从文件名处开始计算)+ CRC校验(2字节)

        发送之后,Term等待接收方应答。

        2.模块(接收方)收到数据包后,校验有效会发送ACK应答,并继续发送‘C’,开启文件传输。

        3.Term(接收方)收到ACK后,等待接收‘C’,以开始发送数据包。根据设置,可选择下面2种格式:

        开始信号(SOH)+ 序号(01H)+ 补码(FEH)+ 128字节数据 + CRC校验(2字节)

        或

        开始信号(STX)+ 序号(01H)+ 补码(FEH)+ 1024字节数据 + CRC校验(2字节)

        其中“序号”依据数据包的数量逐包累加,由发送方确定。每发送完一包,发送方就等待ACK回应。

        4.当文件数据全部发送完成后,Term(发送方)将发送‘EOT’,表示文件发送完成。

        5.模块(接收方)收到‘EOT’后,返回ACK应答。

        6.Term(发送方)收到ACK应答后,将发送一包数据内容为全0的数据。格式如下:

        开始信号(SOH)+ 序号 + 补码 + 128个0 + CRC校验(2字节)

        7.模块(接收方)返回ACK应答,结束整个传输过程。

    五、说明

        1.从传输过程的步骤中可以看出,有些操作并不是严格按照ymodem协议的要求来执行的。其中:模块(接收方)收到一包数据后,并没有验证CRC是否正确,而是通过验证“序号”和“补码”间的数学关系是否正确,来确认该包数据是否有效。

        2.固件传输过程中,一旦发生错误(数据传输出错、“序号”出错、“序号”和“补码”间计算错误等),模块(接收方)将重启固件传输过程,即重新发送‘C’。

        3.如果模块(接收方)收到的数据包中的序号出错(不连续),则回应NAK,Term(发送方)收到NAK后,会重发该包。若发送方连续若干次收到NAK,则终止传输。

        4.固件传输过程中,如果模块(接收方)连续若干次发生错误,则接收方将发送2个‘CA’终止传输。Term(发送方)收到‘CA’后,进入终止传输过程,即同样发送2个‘CA’后结束。

    六、使用符号

        #define SOH    (0x01)  // 128字节数据包起始标志

        #define STX    (0x02)  // 1024字节数据包起始标志

        #define EOT    (0x04)  // 文件传输结束标志

        #define ACK    (0x06)

        #define NAK    (0x15)

        #define CA     (0x18)

  • 相关阅读:
    S5PV210开发板刷机(SD卡uboot、串口+USB-OTG刷机方法)
    S5PV210启动过程分析
    总结:ARM逻辑和高级C(朱老师物联网学习)
    C语言笔记(数组地址一些细节)
    shell脚本和常用命令
    ansible
    firewalld
    LAMP架构上线动态网站WordPress
    LNMP架构上线动态网站
    Tomcat集群 Nginx负载均衡 shell脚本实时监控Nginx
  • 原文地址:https://www.cnblogs.com/mfc1207/p/8979178.html
Copyright © 2020-2023  润新知