Ymodem协议说明

1.Ymodem帧格式

Ymodem两种帧格式:

1024数据格式帧:

名称 帧头 包号 包号反码 信息块 校验
简写 SOH PN XPN DATA CRC
字节数 1 1 1 128 2
128数据格式帧:
名称 帧头 包号 包号反码 信息块 校验
简写 STX PN XPN DATA CRC
字节数 1 1 1 1024 2

1.1 帧头

帧头一个有两种,主要是用来表示不同信息块的长度。

帧头 SOH(0x01) STX(0x02)
信息块长度 128字节 1024字节

1.2包号/包号反码

数据包序号只有1字节,因此计算范围是0~255;对于数据包大于255的,序号归零重复计算。

1.3 帧长度

  • 以SOH(0x01)开始的数据包,信息块是128字节,该类型帧总长度为133字节。
  • 以STX(0x02)开始的数据包,信息块是1024字节,该类型帧总长度为1029字节。

1.4 校验

Ymodem采用的是CRC16校验算法,校验值为2字节,传输时CRC高八位在前,低八位在后;CRC计算数据为信息块数据,不包含帧头、包号、包号反码。

2.Ymodem握手信号

握手信号由下位机(接收方)发起,在上位机(发送方)开始传输文件前,下位机(接收方)需先发送YMODEM_C (字符C,ASII码为0x43)命令,上位机(发送方)收到后,开始传输起始帧。

注意:这里说明的是通用的Ymodem协议,并不是传统的BootLoader协议,正常Bootloader流程,应该是上位机发送升级指令,开启下位机升级流程,所以要将Ymodem协议定制为Bootloader协议需要将握手协议这里优化或修改。

3.Ymodem起始帧

Ymodem起始帧并不直接传输文件内容,而是先将文件名和文件大小置于数据帧中传输;起始帧是以SOH 133字节长度帧传输,帧格式如下:

帧头 包号 包号反码 文件名称 文件大小 填充区 效验高位 效验低位
SOH 0x00 0xFF File name+0x00 File size+0x00 NULL(0x00) CRC-H CRC-L

其中包号为固定为0;File name为文件名称,文件名称后必须加0x00作为结束;File size为文件大小值,文件大小值后必须加0x00作为结束;余下未满128字节数据区域,则以0x00填充。

4.Ymodem数据帧

Ymodem数据帧传输,在信息块填充有效数据。

帧头 包号 包号反码 有效数据 效验高位 效验低位
SOH/STX PN XPN DATA CRC-H CRC-L

传输有效数据时主要考虑的是最后一包数据的是处理,SOH帧和STX帧有不同的处理。

  • 对于SOH帧,若余下数据小于128字节,则以0x1A填充,该帧长度仍为133字节。
  • 对于STX帧需考虑几种情况:
    • 余下数据等于1024字节,以1029长度帧发送;
    • 余下数据小于1024字节,但大于128字节,以1029字节帧长度发送,无效数据以0x1A填充。
    • 余下数据等于128字节,以133字节帧长度发送。
    • 余下数据小于128字节,以133字节帧长度发送,无效数据以0x1A填充。

5.Ymodem结束帧

Ymodem的结束帧采用SOH 133字节长度帧传输,该帧不携带数据(空包),即数据区、校验都以0x00填充。

帧头 包号 包号反码 数据区 效验高位 效验低位
SOH 0x00 0xFF 0x00 0x00 0x00

6.Ymodem命令

命令 命令码 备注
YMODEM_SOH 0x01 133字节长度帧头
YMODEM_STX 0x02 1024字节长度帧头
YMODEM_EOT 0x04 文件传输结束命令
YMODEM_ACK 0x06 接受正确应答命令
YMODEM_NAK 0x15 重传当前数据包请求命令
YMODEM_CAN 0x18 取消传输命令,连续发送5个该命令
YMODEM_C 0x43 字符C

说明:

  • EOT信号由发送端发送
  • CAN中止传输信号也有发送端发送
  • C的含义在英文的数据手册上的意思有点难以理解,我个人理解成请求数据包,如开始传输的发送C请求起始帧数据,然后再发送C请求文件数据帧,最后有发送一次C请求结束帧!

7.文件传输过程

文件传输流程如下:
Ymodem.png

参考文章

posted @ 2024-06-30 11:03  一月一星辰  阅读(93)  评论(0编辑  收藏  举报