不同传输协议简介
串行通信的文件传输协议主要和常用的有:Xmodem、Ymodem、Zmodem以及KERMIT、Ymodem-G、ASCII等。
ASCII:这是最快的传输协议,但只能传送文本文件。
Xmodem:这种古老的传输协议速度较慢,但由于使用了CRC错误侦测方法,传输的准确率可高达99.6%。
Ymodem:这是Xmodem的改良版,使用了1024位区段传送,速度比Xmodem要快。
Zmodem:采用了串流式(streaming)传输方式,传输速度较快,而且还具有自动改变区段大小和断点续传、快速错误侦测等功能。这是目前最流行的文件传输协议。
Xmodem
XModem是一种在串口通信中广泛使用的异步文件传输协议,分为XModem和1k-XModem协议两种,前者使用128字节的数据块,后者使用1024字节即1k字节的数据块。Xmodem协议传输有接收程序和发送程序完成,先由接收程序发送协商字符,协商校验方式,协商通过之后发送程序就开始发送数据包,接收程序接收到完整的一个数据包之后按照协商的方式对数据包进行校验。校验通过之后发送确认字符,然后发送程序继续发送下一包;如果校验失败,则发送否认字符,发送程序重传此数据包。
信息包格式有如下两种:
---------------------------------------------------------------------------
| Byte1 | Byte2 | Byte3 | Byte4~Byte131| Byte132 |
|-------------------------------------------------------------------------- |
|Start Of Header|Packet Number|~(Packet Number)| Packet Data | Check Sum |
---------------------------------------------------------------------------
---------------------------------------------------------------------------
| Byte1 | Byte2 | Byte3 |Byte4~Byte131|Byte132~Byte133|
|--------------------------------------------------------------------------|
|Start Of Header|Packet Number|~(Packet Number)| Packet Data | 16Bit CRC |
帧字段定义如下:
SOH 01H(Xmodem数据头)
STX 02H(Xmodem-1K数据头)
EOT 04H(发送结束)
ACK 06H(应答)
NAK 15H(非应答)
CAN 18H(取消发送)
校验方式分为累加和与CRC-16,具体操作如下:
在累加和方式中,所有的数据字节都将参与和运算,由于校验和只占一个字节,如果累加的和超过255将从零开始继续累加;
对于发送方仅仅支持校验和的传输方式,接收方应首先发送NAK信号来发起传输,如果发送方没有数据发送过来,需要超时等待3秒之后再发起NAK信号来进行数据传输。
对于数据传输正确,接收方需要发送ACK信号来进行确认,如果数据传输有误,则发送NAK信号,发送方在接收到NAK信号之后需要重新发起该次数据传输。
如果数据已经传输完成,发送方需要发送EOT信号,来结束数据传输。
当接收方发送CAN表示无条件结束本次传输过程,发送方收到CAN后,无需发送EOT来确认,直接停止数据的发送。
详细传输流程如下:

在CRC-16校验方式中,需要注意的是,在发送方,CRC是高字节在前,低字节在后。和校验和方式不同的是,当接收方要求发送方以CRC16校验方式发送数据时以'C'来请求,发送方对此做出应答,流程就如上图所示。当发送方仅仅支持校验和方式时,则接收方要发送NAK来请求,要求以校验和方式来发送数据,如果仅仅支持CRC16校验方式,则只能发送'C'来请求。如果两者都支持的话,优先发送'C'来请求。最后,如果信息包中的数据如果不足128字节,剩余的部分要以0x1A(Ctrl-Z)来填充。
详细传输流程如下:

1k-XModem协议同XModem-CRC16协议差不多,只是数据块长度变成了1024字节即1k,同时每个信息报的第一个字节的SOH变成了STX,STX定义为 <STX> 0x02,能有效的加快数据传输速率。
YModem
YModem协议是XModem的改进协议,它最常用于调制解调器之间的文件传输的协议,具有快速,稳定传输的优点。它的传输速度比XModem快,这是由于它可以一次传输1024字节的信息块,同时它还支持传输多个文件,也就是常说的批文件传输。
YModem分成YModem-1K与YModem-g。
YModem-1K用1024字节信息块传输取代标准的128字节传输,数据使用CRC校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应ACK信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接收,我们现在常说的YModem协议一般也都指的是YModem-1K,下文协议讲解也是YModem-1K。
YModem-g传输形式与YModem-1K差不多,只是它去掉了数据的CRC校验码,同时在发送完一个数据块信息后,它不会等待接收端的ACK信号,而直接传输下一个数据块。正是它没有涉及错误校验与等待响应,才使得它的传输速度比YModem-1K来得快。
YModem的数据格式如下:
YModem的起始帧用于传输文件名与文件的大小,注意该数据包号为0,帧长=3字节的数据首部+128字节数据+2个字节CRC16校验码 = 133字节。数据结构为:
SOH 00 FF filename[ ] filezise[ ] NUL[ ] CRCH CRCL
YModem的数据帧从第二包数据开始,注意该数据包号为1。帧长 = 3字节的数据首部+1024字节数据+2字节的CRC16校验码 = 1029字节。数据结构为:
STX [num] [~num] data[ ] 1A …1A CRCH CRCL
其中的第二个字节为传输的数据包包号,第三个字节为数据包号取反组成。
- 若文件数据的最后一包数据在128~1024之间,则数据部分剩余空间全部用0x1A填充。
- 如果文件的大小小于或等于128字节或者文件数据最后剩余的数据小于128字节,则YModem会选择使用SOH数据帧,即用128字节来传输数据,如果数据不满128字节,剩余的数据用0x1A填充。这时数据帧的结构就变成了:
SOH 01 FE data[ ] 1A …1A CRCH CRCL
当传输结束时,YModem还会再传一包结束数据,只是数据内容为空。帧长=3字节首部+128字节的数据+2字节CRC16校验码 = 133字节,其数据帧结构为:
SOH 00 FF NUL[128] CRCH CRCL
特别注意的是,在文件传输结束时发送端发送了结束标识EOT之后待收到接收端的回复后,还会再发送一包空数据包以表示传输真正结束。
以下为YModem传输流程:
发送端 接收端
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C
SOH 00 FF [55 53…6E 00]" "[32…30 00]'' NUL[96] CRC CRC >>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C
STX 01 FE data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
STX 02 FD data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
STX 03 FC data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
STX 04 FB data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
SOH 05 FA data[100] 1A[28] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NAK
EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C
SOH 00 FF NUL[128] CRCCRC >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
Binary
Bin文件是最纯粹的二进制机器代码, 或者说是"顺序格式"。按照assembly code顺序翻译成binary machine code,内部没有地址标记。Bin是直接的内存映象表示,二进制文件大小即为文件所包含的数据的实际大小。严格意义上来说,Binary不能称之为传输协议,它仅代表上位机对code编译出来的bin文件数据不进行任何协议处理,直接完整地将整个文件数据一下发送出去,中间没有任何超时、错误等帧处理机制。
Ascii
Ascii传输协议实际上就是将整个HEX文件数据一下发送出去,类似Binary方式中途无任何传输管理机制。Hex文件,一般是指Intel标准的十六进制文件。Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。Intel HEX文件经常被用于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。
HEX格式文件以行为单位,每行由“:”(0x3a)开始,以回车键结束(0x0d,0x0a)。行内的数据都是由两个字符表示一个16进制字节,比如”01”就表示数0x01;”0a”,就表示0x0a。对于16位的地址,则高位在前低位在后,比如地址0x010a,在HEX格式文件中就表示为字符串”010a”。下面为HEX文件中的一行:
:10000000FF0462F0F051EFF0A93FF0572FF0A93FFBC
“:”表示一行的开始。
“:”后的第1,2个字符“10”表示本行包含的数据的长度,这里就是0x10即16个。
第3,4,5,6个字符“0000”表示数据存储的起始地址,这里表示从0x0000地址开始存储16个数据,其中高位地址在前,低位地址在后。
第7,8个字符“00”表示数据的类型。该类型总共有以下几种:
00 ----数据记录
01 ----文件结束记录
02 ----扩展段地址记录
04 ----扩展线性地址记录
这里就是0x00即为普通数据记录。
自后的32个字符就是本行包含的数据,每两个字符表示一个字节数据,总共有16个字节数据跟行首的记录的长度相一致。
最后两个字符表示校验码。
每个HEX格式的最后一行都是固定为:
:00000001FF
以上的信息其实就足够进行HEX转BIN格式的程序的编写。
解析HEX文件的编程思路是从文件中一个一个读出字符,根据“:”判断一行的开始,然后每两个字符转换成一个字节,并解释其对应的意义。然后将数据从该行中剥离出来保存到缓冲区中,并最终输出到文件中。
By Urien 2021年4月16日11:12:47