XModem协议介绍

XModem协议介绍: XModem是一种在串口通信中广泛使用的异步文件传输协议,分为XModem和1k-XModem协议两种,前者使用128字节的数据块,后者使用1024字节即1k字节的数据块。

一、XModem校验和协议

1. XModem信息包格式

XModem协议最早由Ward Christensen在20世纪70年代提出并实现的,传输数据单位为信息包,信息包格式如下:

---------------------------------------------------------------------------
|     Byte1     |    Byte2    |     Byte3      |Byte4~Byte131|  Byte132   |
|-------------------------------------------------------------------------|
|Start Of Header|Packet Number|~(Packet Number)| Packet Data |  Check Sum |
---------------------------------------------------------------------------

2. 校验和的计算

所有的数据字节都将参与和运算,由于校验和只占一个字节,如果累加的和超过255将从零开始继续累加。

3. 字段定义
<SOH> 01H
<EOT> 04H
<ACK> 06H
<NAK> 15H
<CAN> 18H

4. 校验和方式的XModem传输流程
传输流程如图所示:

------------------------------------------------------------------------------
|               SENDER                |          |          RECIEVER         |
|                                     |  <---    |  NAK                      |
|                                     |          |  Time out after 3 second  |
|                                     |  <---    |  NAK                      |
| SOH|0x01|0xFE|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  ACK                      |
| SOH|0x02|0xFD|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  NAK                      |
| SOH|0x02|0xFD|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  ACK                      |
| SOH|0x03|0xFC|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  ACK                      |
| .                                   |          |  .                        |
| .                                   |          |  .                        |
| .                                   |          |  .                        |
|                                     |  <---    |  ACK                      |
| EOT                                 |  --->    |                           |
|                                     |  <---    |  ACK                      |
------------------------------------------------------------------------------

对于发送方仅仅支持校验和的传输方式,接收方应首先发送NAK信号来发起传输,如果发送方没有数据发送过来,需要超时等待3秒之后再发起NAK信号来进行数据传输。对于数据传输正确,接收方需要发送ACK信号来进行确认,如果数据传输有误,则发送NAK信号,发送方在接收到NAK信号之后需要重新发起该次数据传输,如果数据已近传输完成,发送方需要发送EOT信号,来结束数据传输。

5. 如何取消数据传输
当接收方发送CAN表示无条件结束本次传输过程,发送方收到CAN后,无需发送EOT来确认,直接停止数据的发送。


二、XModem-CRC16协议

1. XModem-CRC16信息包格式
XModem协议在90年代做过一次修改,将132字节处的校验和改成双字节的CRC16校验,CRC16校验的信息包格式如下:

------------------------------------------------------------------------------
|     Byte1     |    Byte2    |     Byte3      |Byte4~Byte131|Byte132~Byte133|
|----------------------------------------------------------------------------|
|Start Of Header|Packet Number|~(Packet Number)| Packet Data |   16Bit CRC   |
------------------------------------------------------------------------------

2. CRC16的计算

int calcrc(char *ptr, int count)
{
	int crc;
	char i;

	crc = 0;
	while (--count >= 0)
	{
		crc = crc ^ (int) *ptr++ << 8;
		i = 8;
		do
		{
			if (crc & 0x8000)
				crc = crc << 1 ^ 0x1021;
			else
				crc = crc << 1;
		} while (--i);
	}

	return (crc);
}

需要注意的是,在发送方,CRC是高字节在前,低字节在后。

3. CRC16校验的XModem传输流程

传输流程如图所示:

---------------------------------------------------------------------------
|               SENDER             |          |           RECIEVER        |
|                                  |  <---    |  'C'                      |
|                                  |          |  Time out after 3 second  |
|                                  |  <---    |  'C'                      |
| SOH|0x01|0xFE|Data[0~127]|CRC16| |  --->    |                           |
|                                  |  <---    |  ACK                      |
| SOH|0x02|0xFD|Data[0~127]|CRC16| |  --->    |                           |
|                                  |  <---    |  NAK                      |
| SOH|0x02|0xFD|Data[0~127]|CRC16| |  --->    |                           |
|                                  |  <---    |  ACK                      |
| SOH|0x03|0xFC|Data[0~127]|CRC16| |  --->    |                           |
|                                  |  <---    |  ACK                      |
| .                                |          |  .                        |
| .                                |          |  .                        |
| .                                |          |  .                        |
|                                  |  <---    |  ACK                      |
| EOT                              |  --->    |                           |
|                                  |  <---    |  ACK                      |
---------------------------------------------------------------------------

和校验和方式不同的是,当接收方要求发送方以CRC16校验方式发送数据时以'C'来请求,发送方对此做出应答,流程就如上图所示。当发送方仅仅支持校验和方式时,则接收方要发送NAK来请求,要求以校验和方式来发送数据,如果仅仅支持CRC16校验方式,则只能发送'C'来请求。如果两者都支持的话,优先发送'C'来请求,流程如图所示:

------------------------------------------------------------------------------
|               SENDER                |          |           RECIEVER        |
|                                     |  <---    |  'C'                      |
|                                     |          |  Time out after 3 second  |
|                                     |  <---    |  NAK                      |
|                                     |          |  Time out after 3 second  |
|                                     |  <---    |  'C'                      |
|                                     |          |  Time out after 3 second  |
|                                     |  <---    |  NAK                      |
| SOH|0x01|0xFE|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  ACK                      |
| SOH|0x02|0xFD|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  NAK                      |
| SOH|0x02|0xFD|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  ACK                      |
| SOH|0x03|0xFC|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  ACK                      |
| .                                   |          |  .                        |
| .                                   |          |  .                        |
| .                                   |          |  .                        |
|                                     |  <---    |  ACK                      |
| EOT                                 |  --->    |                           |
|                                     |  <---    |  ACK                      |
------------------------------------------------------------------------------

最后,如果信息包中的数据如果不足128字节,剩余的部分要以0x1A(Ctrl-Z)来填充。


三、1k-XModem协议
1k-XModem协议同XModem-CRC16协议差不多,只是数据块长度变成了1024字节即1k,同时每个信息报的第一个字节的SOH变成了STX,STX定义为 <STX> 0x02,能有效的加快数据传输速率。

YMODEM协议是一个文件传输协议,由Chuck Forsberg于上世纪90年代开发完成,通常用于资源受限的设备。

ST官方在STM32CubeHAL库中提供了一个IAP例程,其使用的便是YMODEM协议。这个协议有比较多的变种(YMODEM作者在其协议手册中提及),以至于大家的实现不太一样,本文以STM32CubeHAL库中IAP例程的实现为标准。

下面先对YMODEM协议进行介绍,然后进行代码实现和例程试验。

1. YMODEM协议简介

YMODEM协议的传输过程如下图所示(摘自YMODEM协议手册):

  • 其中“sb foo.*<CR>”指的是Linux中的sb命令,可在Linux终端执行 sb --help查看使用方法
  • 上图中YMODEM协议传输的数据块是128字节,其实YMODEM协议还支持1024字节的数据块,或者128字节和1024字节混合模式。详情请查阅YMODEM协议手册
  • SOH 表示本数据块大小为128字节
  • STX 表示本数据块大小为1024字节
  • 本文中EOT指令仅有一次会话,即上图中的最后一次

2. 起始帧的数据格式

YMODEM的起始帧的数据块大小为128字节,传输的是文件名、文件大小、文件修改日期等信息,其中文件名和文件大小信息是必须的。128字节的剩余部分用空字符填充(也就是0)。

SOH 00 FF foo.c 3232 NUL[118] CRCH CRCL
  • SOH:表示本帧数据块大小为128字节
  • 00: 表示数据帧序号,初始是0,依次向下递增,FF是帧序号的取反
  • foo.c:是要传输的文件名,是ASCII字符串(以空字符结尾)
  • 3232:表示文件的大小,是ASCII字符串(以空字符结尾)
  • NUL[118]:剩余部分用空字符填充
  • CRCH/L: 表示16位CRC校验码的高8位与低8位

3. 数据帧的数据格式

YModem的数据帧的数据块大小可以是128字节或者1024字节。

// 128字节的数据块 
SOH 01 FE data[128] CRCH CRCL

// 1024字节的数据块 
STX 01 FE data[1024] CRCH CRCL

一般会使用1024字节的数据块进行传输,这样可以加快传输速度,如果最后文件数据不足1024字节,则将其拆分为128字节的数据块进行传输,如果拆分后有不足128字节的数据依然按照128字节的数据块进行传输,但是剩余空间全部用0x1A填充,以表示文件结束。

4. 结束帧数据结构

当文件传输结束时,除了发送EOT传输结束指令外,还需要发送一个结束帧。YModem的结束帧与起始帧的数据格式相同,数据块大小为128字节,但是结束帧的数据块要全用空字符填充。

SOH 3A C5 NUL[128] CRCH CRCL

 

  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: xmodem协议是一种在计算机通信中广泛使用的协议,它用于在串行通信中可靠地传输文件。这种协议最初是由Ward Christensen和Bill Osterhagen在上世纪70年代末开发的。 xmodem协议使用了比特循环冗余校验(CRC)算法,以确保数据的完整性。它将文件分成128字节的数据块,并附加一个校验和来验证数据块的准确性。发送方首先发送数据块和校验和,接收方收到后会对数据块进行校验。如果校验和不匹配,接收方会通知发送方重新发送该数据块,直到校验和匹配为止。 在C语言中,我们可以使用串口编程库或者自己编写相关的通信函数来实现xmodem协议。首先,我们需要打开串口,并设置通信参数,如波特率、数据位、校验位和停止位。然后,我们可以编写发送和接收数据块的函数。 发送数据块的函数首先读取文件,将文件数据分成128字节的块,并计算出校验和。然后,它通过串口将数据块和校验和发送给接收方,并等待接收方的响应。如果接收方收到的响应是重新传输请求,发送方会重新发送数据块,直到接收到确认响应才移动到下一个数据块。 接收数据块的函数负责接收数据块和校验和,并进行校验。如果数据块和校验和匹配,它会将数据块写入文件。然后,它发送一个确认响应给发送方,表示已成功接收,可以传输下一个数据块。如果数据块和校验和不匹配,它会发送一个重新传输请求给发送方。 总之,通过在C语言中编写适当的通信函数,我们可以实现xmodem协议,从而在串行通信中可靠地传输文件。 ### 回答2: xmodem协议是一种常用的通信协议,主要用于通过串口进行文件传输。它是由Ward Christensen在上世纪70年代提出并设计的。xmodem协议基于字符传输,可用于在不可靠的通信链路上进行可靠的文件传输。 xmodem协议的核心思想是将文件分割成固定大小的数据块进行传输,并通过校验和来保证数据的正确性。具体传输过程如下: 发送方将文件分割成128字节的数据块,并为每个数据块生成一个校验和。发送方首先发送一个文件名进行通知,并等待接收方的确认。 接收方收到文件名后,发送一个确认信号。然后,发送方将数据块和校验和发送给接收方。 接收方接收到数据后进行校验,如果校验和正确,则发送一个确认信号,表示接收成功。如果校验和错误,则发送一个请求重传的信号。 发送方在接收到重传请求后重新发送当前数据块,直到接收方成功接收为止。全部数据块发送完毕后,发送方发送一个结束信号。 接收方在接收到结束信号后发送一个确认信号,表示传输完成。整个文件传输过程结束。 在C语言中,可以使用串口通信库来实现xmodem协议的文件传输。通过设置串口参数,打开串口,并编写发送和接收函数来实现xmodem协议。 具体步骤包括创建文件分割函数、校验和生成函数、串口初始化函数、发送函数和接收函数等。在发送函数中,将文件分割成数据块,并计算校验和,在接收函数中,接收数据,并进行校验。 通过使用C语言和xmodem协议,可以实现可靠的文件传输,适用于各种嵌入式系统和通信设备。 ### 回答3: xmodem协议是一种用于在计算机之间进行可靠数据传输的通信协议。它采用C语言来实现。 xmodem协议的实现是基于串行通信线路的,通过串行通信线路将数据从发送方传输到接收方。它具有以下基本特点: 1. 数据分块传输:xmodem协议将数据分成一块一块的小数据块进行传输,每个小数据块大小为128字节。当数据量超过128字节时,会分为多个小数据块进行传输。 2. 帧结构:每个小数据块被包装在一个帧中传输。帧结构包括帧头、数据块、CRC校验和和帧尾,用于保障数据传输的可靠性。 3. 数据确认和反馈:接收方在接收到每个数据帧后会发送一个确认帧给发送方,表示接收成功。如果发送方在规定时间内没有收到确认帧,则会重传数据帧。 4. 错误校验:每个数据帧通过计算CRC校验和来验证接收到的数据的准确性,以保证数据的完整性。 C语言可以通过使用串口库函数或串行通信库来实现xmodem协议。在发送方,需要将待传输的数据按照规定的帧结构进行封装,并通过串口将帧发送给接收方。在接收方,需要通过串口监听数据并解析每个帧的数据内容,并校验CRC校验和。如果校验成功,则发送确认帧给发送方,否则请求发送方重传。 总结来说,xmodem协议利用C语言的串口通信库函数实现了可靠的数据传输。通过分块传输、帧结构、数据确认和错误校验等机制,保证了数据的完整性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值