野火电子论坛

标题: 【野火多功能调试助手】 [打印本页]

作者: LONG_R3acc    时间: 2020-6-22 17:28
标题: 【野火多功能调试助手】
本帖最后由 LONG_R3acc 于 2020-10-28 09:38 编辑

[md]野火串口助手协议发送文件通讯协议

====================================

修订历史

| 日期 | 版本 | 更新内容 |
| - | - | - |
| 2020/6/22 | 0.0.1 | 首次发布 |

# XMODEM协议

上位机是现实了XModem-CRC16和XModem-1K;

- XModem-CRC16使用CRC-16校验方式,数据长度为128字节
- XModem-1K使用CRC-16校验方式,数据长度为1024字节

## XModem协议字段定义

| 缩写 | 十六进制 | 含义 |
| - | - | - |
| SOH | 0x01 | 数据包的大小为 128 bytes |
| STX | 0x02 | 数据包的大小为 1024 bytes |
| EOT | 0x04 | 传输结束 |
| ACK | 0x06 | 应答 |
| NAK | 0x15 | 非应答 |
| CAN | 0x18 | 取消 |
| C | 0x43 | 启动传输 |

## XModem协议格式详解

### XModem-CRC16

在XModem-CRC16的数据帧中使用128字节空间用来传输文件数据,帧格式如下:

| 协议头 | 帧序号 | 帧序号补码 | 数据 | CRC高8位 | CRC低8位 |
| - | - | - | - | - | - |
| SOH | 0x01 | 0xFE | data[128] | CRCH | CRCL |

- 协议头:SOH=0x01,表示这个数据帧包含128个字节数据;
- 帧序号、帧序号补码:0x01是表示帧序号,0xFE是它的取反,再下一帧数据就是0x02 0xFD,以此类推;
- 数据:存放了128字节的文件数据;
- CRC高8位:CRC-16校验数据的高8位;
- CRC低8位:CRC-16校验数据的低8位;

如果最后一帧剩余的数据小于128字节,则剩余空间全部用0x1A(Ctrl-Z)填充;

### XModem-1K

在XModem-1K的数据帧中使用1024字节空间用来传输文件数据,帧格式如下:

| 协议头 | 帧序号 | 帧序号补码 | 数据 | CRC高8位 | CRC低8位 |
| - | - | - | - | - | - |
| STX | 0x01 | 0xFE | data[1024] | CRCH | CRCL |

- 协议头:STX=0x02,表示这个数据帧包含1024个字节数据;
- 帧序号、帧序号补码:0x01是表示帧序号,0xFE是它的取反,再下一帧数据就是0x02 0xFD,以此类推;
- 数据:存放了1024个字节的文件数据;
- CRC高8位:CRC-16校验数据的高8位;
- CRC低8位:CRC-16校验数据的低8位;

如果最后一帧剩余的数据小于1024字节,则剩余空间全部用0x1A(Ctrl-Z)填充;

## XModem-CRC16文件传输示例

下面以传输一个文件为例来具体说明XModem文件传输过程。

- 文件名为:foo.c,文件大小为:356字节;

| 序号 | 发送方 | 接收方 |
| - | - | - |
| 1 | - | C |
| 2 | STX 0x01 0xFE Data[128] CRC CRC | - |
| 3 | - | ACK |
| 4 | STX 0x02 0xFC Data[128] CRC CRC | - |
| 5 | - | NAK |
| 6 | STX 0x02 0xFC Data[128] CRC CRC | - |
| 7 | - | ACK |
| 8 | SOH 0x03 0xFB Data[100] CPMEOF[28] CRC CRC | - |
| 9 | - | ACK |
| 10 | EOT | - |
| 11 | - | ACK |

1. 接收方发送**C**(这里C是告诉发送方我们要使用CRC-16的校验方式)给发送方,告诉发送方可以开始传输数据了,然后发送方就会发送文件数据给接收方了;
2. 当接收方到正确的数据后返回**ACK**,不正确时返回**NAK**,此时发送方将会重新发送上一次的数据;
3. 当文件传输完成后,发送方会发送**EOT**,表示文件发送完了,接收方返回**ACK**表示文件正式传输完成;

**注意:** 如果接收方不能接收文件后,可以发送**CAN**给发送方来取消文件传输。

## XModem-1K文件传输示例

下面以传输一个文件为例来具体说明XModem文件传输过程。

- 文件名为:foo.c,文件大小为:3048字节;

| 序号 | 发送方 | 接收方 |
| - | - | - |
| 1 | - | C |
| 2 | STX 0x01 0xFE Data[1024] CRC CRC | - |
| 3 | - | ACK |
| 4 | STX 0x02 0xFC Data[1024] CRC CRC | - |
| 5 | - | NAK |
| 6 | STX 0x02 0xFC Data[1024] CRC CRC | - |
| 7 | - | ACK |
| 8 | STX 0x03 0xFB Data[1000] CPMEOF[24] CRC CRC | - |
| 9 | - | ACK |
| 10 | EOT | - |
| 11 | - | ACK |

1. 接收方发送**C**(这里C是告诉发送方我们要使用CRC-16的校验方式)给发送方,告诉发送方可以开始传输数据了,然后发送方就会发送文件数据给接收方了;
2. 当接收方到正确的数据后返回**ACK**,不正确时返回**NAK**,此时发送方将会重新发送上一次的数据;
3. 当文件传输完成后,发送方会发送**EOT**,表示文件发送完了,接收方返回**ACK**表示文件正式传输完成;

**注意:** 如果接收方不能接收文件后,可以发送**CAN**给发送方来取消文件传输。

# YMODEM协议

YModem是XModem的升级版协议,两者最大的区别是YModem可以支持传输多个文件。

通常所说的YModem协议是指的YModem-1K,除此之外还有YModem-G,YModem-G 无需无错误通道的认可或当调制解调器自纠错时就可传送,但是一旦出现错误传送就会取消。,上位机**没有**实现这协议。

## YModem协议字段定义

| 缩写 | 十六进制 | 含义 |
| - | - | - |
| SOH | 0x01 | 数据包的大小为 128 bytes |
| STX | 0x02 | 数据包的大小为 1024 bytes |
| EOT | 0x04 | 传输结束 |
| ACK | 0x06 | 应答 |
| NAK | 0x15 | 非应答 |
| CAN | 0x18 | 取消 |
| C | 0x43 | 启动传输 |

## YModem协议格式详解

1.起始帧的数据格式

帧长=3字节数据首部+128字节数据+2字节CRC16校验码=133字节。它的数据结构如下:

| 协议头 | 帧序号 | 帧序号补码 | 文件名 | 文件大小 | 空 | CRC高8位 | CRC低8位 |
| - | - | - | - | - | - | - | - |
| SOH | 0x00 | 0xFF | filename | filezise | NUL | CRCH | CRCL |

- 协议头:SOH=0x01,表示这个数据帧包含128个字节数据;
- 帧序号、帧序号补码:表示传输的帧数,大于0xFF后从0x00重新开始,补码是了为了确保传输的正确性;
- 文件名:要传输的文件名,以'\0'结束;
- 文件大小:要传输的文件大小,用字符串表示,紧跟在文件名后面,例如要传输1234个字节的文件,那么就是:0x31 0x32 0x33 0x34 0x00;
- 空:除去文件名和文件大小,剩下的数据使用0填充;
- CRC高8位:CRC-16校验数据的高8位
- CRC低8位:CRC-16校验数据的低8位

2.数据帧的数据格式

在YModem的数据帧中使用1024字节空间用来传输文件数据,它跟起始帧格式差不多,如下:

| 协议头 | 帧序号 | 帧序号补码 | 数据 | CRC高8位 | CRC低8位 |
| - | - | - | - | - | - |
| STX | 0x01 | 0xFE | data[1024] | CRCH | CRCL |

- 协议头:STX=0x02,表示这个数据帧包含1024个字节数据;
- 帧序号、帧序号补码:0x01是表示帧序号,0xFE是它的取反,再下一帧数据就是0x02 0xFD,以此类推;
- 数据:存放了1024个字节的文件数据;
- CRC高8位:CRC-16校验数据的高8位;
- CRC低8位:CRC-16校验数据的低8位;

文件的最后一帧分三种特殊情况:

1. 最后一帧剩余的数据大于128字节:使用STX的1024字节传输,但是剩余空间全部用0x1A(Ctrl-Z)填充;
2. 最后一帧剩余的数据等于128字节:使用SOH的128字节传输;
3. 最后一帧剩余的数据小于128字节:使用SOH的128字节传输,但是剩余空间全部用0x1A(Ctrl-Z)填充;

3.结束帧数据结构

YModem的结束帧数据也采用SOH的128字节数据帧,它的结构如下:

| 协议头 | 帧序号 | 帧序号补码 | 数据 | CRC高8位 | CRC低8位 |
| - | - | - | - | - | - |
| SOH | 0x00 | 0xFF | NUL[128] | CRCH | CRCL |

结束帧以SOH开头,表示后面数据大小为128字节,但128字节的数据部分不存放任何信息,即全部用00填充;结束帧的帧序号也认为是0x00 0xFF。

## YModem文件传输示例

下面以传输两个文件为例来具体说明YModem文件传输过程。

- 第一个文件名为:foo.c,文件大小为:2148字节;
- 第二个文件名为:b.c,文件大小为:2024字节。

| 序号 | 发送方 | 接收方 |
| - | - | - |
| 1 |   | C |
| 2 | SOH 0x00 0xFF [0x66...0x63] 0x00 [0x32...0x38] 0x00 NUL[117] CRC CRC | - |
| 3 | - | ACK |
| 4 | - | C |
| 5 | STX 0x01 0xFE Data[1024] CRC CRC | - |
| 6 | - | ACK |
| 7 | STX 0x02 0xFC Data[1024] CRC CRC | - |
| 8 | - | NAK |
| 9 | STX 0x02 0xFC Data[1024] CRC CRC | - |
| 10 | - | ACK |
| 11 | SOH 0x03 0xFB Data[100] CPMEOF[28] CRC CRC | - |
| 12 | - | ACK |
| 13 | EOT | - |
| 14 | - | NAK |
| 15 | EOT | - |
| 16 | - | ACK |
| 17 | - | C |
| 18 | SOH 0x00 0xFF 0x62 0x2E 0x63 0x00 [0x32...0x34] 0x00 NUL[119] CRC CRC | - |
| 19 | - | ACK |
| 20 | - | C |
| 21 | STX 0x01 0xFB Data[1024] CRC CRC | - |
| 22 | - | ACK |
| 23 | STX 0x01 0xFB Data[1000] CPMEOF[24] CRC CRC | - |
| 24 | - | ACK |
| 25 | EOT | - |
| 26 | - | NAK |
| 27 | EOT | - |
| 28 | - | ACK |
| 29 | - | C |
| 30 | SOH 0x00 0xFF NUL[128] CRC CRC | - |
| 31 | - | ACK |

1. 接收方发送**C**给发送方,告诉发送方可以开始传输数据了,接收方第一次收到**C**后会传输文件名和文件大小信息;
2. 接收方在次发送**C**给发送方后,就正式开始文件内容的传输了;
3. 当接收方到正确的数据后返回**ACK**,不正确时返回**NAK**,此时发送方将会重新发送上一次的数据;
4. 当文件传输完成后,发送会发送**EOT**,接收方第一次收到EOT时应放回**NAK**,如果再次收到**EOT**,则返回**ACK**,这样做的目的是确保文件传输结束了,而不是其他干扰数据;
5. 接收方接收完一个文件后,再次发送**C**给发送方,如果发送方还有待发送的文件,则会发送带有文件名和大小的**SOH**帧;如果发送方没有待发送的文件,则会发送**SOH**数据帧,其中128字节数据都是0x00。

**注意:** 如果接收方不能接收文件后,可以发送**CAN**给发送方来取消文件传输。

**野火大学堂**——(敲黑板)这是重点,要考的
----------------------------------------

### 【野火大学堂】简介

![Image text](https://cloud.firebbs.cn/forum/2 ... sxxq2sjr99rnsj7.png)

野火大学堂是一个电脑客户端,主要用来方便用户下载野火所有产品的资料,是一款集资料下载,在线文档,在线视频和资料更新推送于一体的软件,
免费登录,下载速度快过百度云。以后野火的资料发布和更新主要是通过野火大学堂来完成。
以后嵌入式学习,不妨来【野火大学堂】看看,stm32,rt1052,linux,fpga,freertos,rt-thread,ucos,liteos,emwin,emxgui,lwip等资料应有尽有,一站式学习,省时又省力。

### 【野火大学堂】下载地址(复制至浏览器打开)

- 下载地址1:http://t.cn/A6w7JiKs (境外,sourceforge)
- 下载地址2:https://cloud.embedfire.com/soft ... er-x64-v1.0.2.4.exe
- 下载地址3:https://pan.baidu.com/s/1N6ODCAO4i2x8rXXOLMJm4Q  提取码:hn4w(百度云下载)

### 【野火大学堂】登录方式

1. 微信:手机微信扫码登录(推荐);
2. 野火论坛:论坛帐号登录,没有帐号的可以先到野火论坛www.firebbs.cn先注册个帐号(推荐);
3. QQ:要想使用QQ扫码登录,必须先绑定论坛帐号,如果没有论坛帐号的可以先到野火论坛www.firebbs.cn先注册个帐号,并将论坛帐号与QQ绑定;
4. Github:Gitbub帐号登录。

[/md]
作者: 杰杰    时间: 2020-6-22 23:37
帮顶
作者: ZZZ_XXJ    时间: 2020-6-23 08:44
顶一个
作者: wangjinyang    时间: 2020-6-24 16:54
什么时候放出来
作者: LONG_R3acc    时间: 2020-6-24 19:41
wangjinyang 发表于 2020-6-24 16:54
什么时候放出来

想要文件传输?
作者: xy20092010    时间: 2021-2-4 11:05
本帖最后由 xy20092010 于 2021-2-4 11:58 编辑

假如恰好最后一帧的数据结尾就是若干0x1A,然后不满128字节,后面的填充值也是0x1A,那传输的文件内容不就会发生错误了吗?文件最后的0x1A被当作填充字符而被丢弃,协议里又没有指定传输数据长度的信息
作者: LONG_R3acc    时间: 2021-2-5 11:22
xy20092010 发表于 2021-2-4 11:05
假如恰好最后一帧的数据结尾就是若干0x1A,然后不满128字节,后面的填充值也是0x1A,那传输的文件内容不就 ...

会的,YMODEM支持在最开始的时候发送文件大小,我们的上位机也是支持发送文件大小的,我写的下位机也支持长度计算的。有的是不支持发送文件大小,会有意外丢掉数据的情况,我就遇到过,所以安全起见还有要用文件大小。
我写的下位机,接收的文件放到SD卡,配套F429-V2挑战者:
https://gitee.com/LONGZR007/IAP-STM32/tree/master/YMODEM-SD
作者: xy20092010    时间: 2021-2-7 16:43
LONG_R3acc 发表于 2021-2-5 11:22
会的,YMODEM支持在最开始的时候发送文件大小,我们的上位机也是支持发送文件大小的,我写的下位机也支持 ...

原来xmodem真的不是透明传输,我还以为我看错了。。。那还有一个问题,文件序号是1个字节,理论最大255,每次传输最大1k,那么相乘得255000字节,假如传输的内容比这个还大,会怎样?
作者: LONG_R3acc    时间: 2021-2-23 17:03
xy20092010 发表于 2021-2-7 16:43
原来xmodem真的不是透明传输,我还以为我看错了。。。那还有一个问题,文件序号是1个字节,理论最大255, ...

序号重新开始计数
作者: xiao_yang    时间: 2022-2-26 13:54
提交个问题,在使用野火多功能调试助手的协议传输时,发现最后一包数据的填充与描述的0x1A不符合,Debug后发现使用的是0x00填充的。希望能解决一下
作者: LONG_R3acc    时间: 2022-3-1 18:09
xiao_yang 发表于 2022-2-26 13:54
提交个问题,在使用野火多功能调试助手的协议传输时,发现最后一包数据的填充与描述的0x1A不符合,Debug后 ...

这没太注意过,因为他有文件大小的数据,所以我没用到过这个判断方法,并且这个判断方法有时候不准,建议不要这样用
作者: xiao_yang    时间: 2022-3-4 11:35
LONG_R3acc 发表于 2022-3-1 18:09
这没太注意过,因为他有文件大小的数据,所以我没用到过这个判断方法,并且这个判断方法有时候不准,建议 ...

文件大小判断我也用了,想的是,这样判断可以两种判断方法可以互相检查




欢迎光临 野火电子论坛 (https://www.firebbs.cn/) Powered by Discuz! X3.4