Xmodem通信
- 格式:doc
- 大小:95.00 KB
- 文档页数:9
XMODEM协议XMODEM协议是一种用于串行通信的错误检测和纠正协议,能够保证可靠地传输文件。
XMODEM协议基于逐块传输的原理,将大文件划分为若干个块,然后逐个传输和校验块。
XMODEM协议的工作流程如下:1. 发送方准备传输的文件,将文件分成多个块(通常为128字节)。
2. 发送方发送一个控制字符C,作为开始传输的信号。
3. 接收方收到控制字符C后,发送一个ACK应答信号,表示准备好接收。
4. 发送方开始发送文件的第一个块,包括块号、数据、校验和等信息。
5. 接收方接收到数据后进行校验,如果数据正确,则发送一个ACK应答信号。
6. 发送方收到ACK应答信号后,开始发送下一个块。
7. 接收方连续收到块,并进行校验,直到收到发送方发送的最后一个块。
8. 接收方发送一个结束字符EOT,表示传输结束。
9. 发送方收到EOT后,发送一个ACK应答信号。
10. 接收方收到ACK应答信号后,传输完成。
XMODEM协议使用校验和来验证接收到的数据的完整性。
发送方在发送每个块之前,计算数据的校验和,并将校验和附加到块的末尾。
接收方收到块后,将接收到的数据和附加的校验和进行计算,与发送方计算的校验和进行比对。
如果两个校验和相等,说明数据没有错误。
如果不相等,接收方会发送一个NAK应答信号,表示接收到的数据有错误,要求发送方重新发送。
XMODEM协议的优势在于其简洁、可靠和易于实现。
然而,由于基于逐块传输的原理,传输效率较低。
每传输一个块需要发送方等待接收方的ACK应答信号,这样会浪费许多时间。
为了提高传输效率,后来出现了改进的XMODEM协议,如XMODEM-CRC和XMODEM-1K。
XMODEM-CRC使用更强大的循环冗余校验(CRC)算法替代了校验和,提高了错误检测的能力。
XMODEM-1K将块的大小增加到1024字节,减少了传输块的数量,从而提高了传输效率。
总结来说,XMODEM协议是一种简单而可靠的传输协议,适用于低带宽、不太强调传输速度的环境下。
xmodem通信协议
Xmodem是一种简单且可靠的串行通信协议,用于在计算机之间传输文件。
它的工作原理是将文件划分为若干个固定长度的数据块,并通过串行线路逐块传输。
每个数据块都包含了一个数据包编号、数据内容和校验和。
传输过程中,发送方将一个数据块发送给接收方,接收方收到后进行校验和验证。
如果数据块包含错误,则接收方会发送一个确认帧给发送方,要求重新发送该数据块。
如果数据块无误,则接收方发送一个确认帧给发送方,表示接收成功。
发送方收到确认帧后,再发送下一个数据块。
传输完成后,发送方发送一个传输结束帧,表示文件传输完毕。
Xmodem协议主要有三个版本:
1. Xmodem: 最早的版本,使用起始位和奇偶校验位来检查数
据的完整性。
每个数据块包含数据、校验和和一个确认帧。
2. Xmodem-CRC: 在Xmodem的基础上引入了循环冗余校验(CRC),提高了错误检测的准确性。
3. Xmodem-1K: 改进版本,每个数据块的长度增加到1024字节,提高了传输速度。
Xmodem通信协议简单易用,广泛应用于早期的串口通信设备和计算机之间的文件传输。
然而,由于其低效的传输速度和简单的错误处理机制,现在已经被更先进的协议所替代,如Ymodem、Zmodem和Kermit等。
研究 Xmodem 协议必看的 11个问题Xmodem 协议作为串口数据传输主要的方式之一,恐怕只有做过 bootloader 的才有机会接触一下, 网上有关该协议的内容要么是英语要么讲解不详细。
笔者以前写 bootloader 时研究过 1k-Xmodem ,参考了不少相关资料。
这里和大家交流一下我对 Xmodem 的理解,多多指教!1. Xmodem 协议是什么?XMODEM协议是一种串口通信中广泛用到的异步文件传输协议。
分为标准Xmodem 和 1k-Xmodem 两种,前者以 128字节块的形式传输数据,后者字节块为 1k 即 1024字节,并且每个块都使用一个校验和过程来进行错误检测。
在校验过程中如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个确认字节 (ACK。
由于 Xmodem 需要对每个块都进行认可, 这将导致性能有所下降, 特别是延时比较长的场合, 这种协议显得效率更低。
除了 Xmodem ,还有 Ymodem , Zmodem 协议。
他们的协议内容和 Xmodem 类似,不同的是 Ymodem 允许批处理文件传输,效率更高; Zmodem 则是改进的了Xmodem ,它只需要对损坏的块进行重发,其它正确的块不需要发送确认字节。
减少了通信量。
2. Xmodem 协议相关控制字符SOH 0x01STX 0x02EOT 0x04ACK 0x06NAK 0x15CAN 0x18CTRLZ 0x1A3.标准 Xmodem 协议(每个数据包含有 128字节数据帧格式_______________________________________________________________| SOH | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和 ||_____|____________|___________________|__________|____________|4. 1k-Xmodem (每个数据包含有 1024字节数据帧格式_______________________________________________________________| STX | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和 ||_____|____________|___________________|__________|____________|5.数据包说明对于标准 Xmodem 协议来说,如果传送的文件不是 128的整数倍,那么最后一个数据包的有效内容肯定小于帧长,不足的部分需要用 CTRL- Z(0x1A来填充。
XMODEM协议XMODEM协议是一种简单而古老的串行通信协议,它用于在计算机之间进行文件传输。
XMODEM协议最初由Ward Christensen和Keith Petersen于1977年开发,它是第一个广泛使用的文件传输协议之一。
尽管XMODEM协议已经被更先进的协议所取代,但它的基本原理仍然对我们理解现代通信协议有所帮助。
XMODEM协议的工作原理非常简单。
发送方将文件分成128字节的数据块,每个数据块都会被编号,接收方在接收到数据块后会发送一个确认信号,如果发送方没有收到确认信号,它会重新发送数据块。
这种简单的确认和重传机制确保了数据的可靠传输。
XMODEM协议的简单性使得它在早期个人计算机上得到了广泛的应用。
然而,它也存在一些缺点。
首先,XMODEM协议的速度相对较慢,因为它在发送每个数据块后都需要等待确认信号。
其次,XMODEM协议没有进行错误检测和纠正,因此在传输过程中很容易出现数据损坏的情况。
为了解决XMODEM协议的缺点,后来出现了一些改进版本,比如YMODEM和ZMODEM。
这些改进版本在速度和可靠性上都有所提高,但它们仍然保留了XMODEM协议的基本原理。
这些改进版本在一定程度上延续了XMODEM协议的影响,但随着现代通信技术的发展,它们也逐渐被更先进的协议所取代。
尽管XMODEM协议已经不再是主流的文件传输协议,但它作为通信协议的基础原理仍然具有重要意义。
通过学习XMODEM协议,我们可以更好地理解通信协议的工作原理,从而更好地理解和应用现代通信技术。
总的来说,XMODEM协议作为早期的文件传输协议,虽然已经被更先进的协议所取代,但它的简单原理和基本思想仍然对我们有所启发。
通过了解XMODEM协议,我们可以更好地理解通信协议的发展历程,从而更好地应用现代通信技术。
因此,即使XMODEM协议已经不再被广泛使用,但它的影响仍然存在,它对我们理解通信协议的发展和应用具有重要意义。
Xmodem、Ymodem协议总结写在前⾯: 本⽂包含如下内容: ⼀、 ⼆、 三、 四、 (4-1) (4-2) 五、 (5-1) (5-2) (5-3) (5-4)⼀、⽂件传输简介 ⽂件传输是数据交换的主要形式。
在进⾏⽂件传输时,为使⽂件能被正确识别和传送,我们需要在两台计算机之间建⽴统⼀的传输协议。
这个协议包括了⽂件的识别、传送的起⽌时间、错误的判断与纠正等内容。
Xmodem、Ymodem和Zmodem协议是最常⽤的三种通信协议。
⼆、传输协议 在SecureCRT下的传输协议有ASCII、Xmodem、Ymodem、Zmodem等。
如下图所⽰,在开发中,可以使⽤SecureCRT软件进⾏⽂件传输。
三、协议特点 (1)Xmodem协议是最早的,传输128字节信息块。
(2)Ymodem是Xmodem的改进版协议,具有传输快速稳定的优点。
它可以⼀次传输1024字节的信息块,同时还⽀持传输多个⽂件。
平常所说的Ymodem协议是指的Ymodem-1K,除此还有Ymodem-g(没有CRC校验,不常⽤)。
YModem-1K⽤1024字节信息块传输取代标准的128字节传输,数据的发送会使⽤CRC校验,保证数据传输的正确性。
它每传输⼀个信息块数据时,就会等待接收端回应ACK信号,接收到回应后,才会继续传输下⼀个信息块,保证数据已经全部接收。
四、XModem协议解析 Xmodem协议传输有接收程序和发送程序完成,先由接收程序发送协商字符,协商校验⽅式,协商通过之后发送程序就开始发送数据包,接收程序接收到完整的⼀个数据包之后按照协商的⽅式对数据包进⾏校验。
校验通过之后发送确认字符,然后发送程序继续发送下⼀包;如果校验失败,则发送否认字符,发送程序重传此数据包。
定义: SOH 01H(modem数据头) EOT 04H(发送结束) ACK 06H(应答) NAK 15H(⾮应答) CAN 18H(取消发送) Xmodem数据包,包含⼀个标题开始字符,⼀个单字节包序号,⼀个包序号的补码,128字节数据和⼀个双字节的CRC校验。
研究Xmodem协议必看的11个问题Xmodem协议作为串口数据传输主要的方式之一,恐怕只有做过bootloader的才有机会接触一下,网上有关该协议的内容要么是英语要么讲解不详细。
笔者以前写bootloader时研究过1k-Xmodem,参考了不少相关资料。
这里和大家交流一下我对Xmodem的理解,多多指教!1.Xmodem协议是什么?XMODEM协议是一种串口通信中广泛用到的异步文件传输协议。
分为标准Xmodem 和1k-Xmodem两种,前者以128字节块的形式传输数据,后者字节块为1k即1024字节,并且每个块都使用一个校验和过程来进行错误检测。
在校验过程中如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个确认字节(ACK)。
由于Xmodem需要对每个块都进行认可,这将导致性能有所下降,特别是延时比较长的场合,这种协议显得效率更低。
除了Xmodem,还有Ymodem,Zmodem协议。
他们的协议内容和Xmodem类似,不同的是Ymodem允许批处理文件传输,效率更高;Zmodem则是改进的了Xmodem,它只需要对损坏的块进行重发,其它正确的块不需要发送确认字节。
减少了通信量。
2.Xmodem协议相关控制字符SOH 0x01STX 0x02EOT 0x04ACK 0x06NAK 0x15CAN 0x18CTRLZ 0x1A3.标准Xmodem协议(每个数据包含有128字节数据)帧格式_______________________________________________________________| | | | | || SOH | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和 ||_____|____________|___________________|__________|____________|4.1k-Xmodem(每个数据包含有1024字节数据)帧格式_______________________________________________________________| | | | | || STX | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和 ||_____|____________|___________________|__________|____________|5.数据包说明对于标准Xmodem协议来说,如果传送的文件不是128的整数倍,那么最后一个数据包的有效内容肯定小于帧长,不足的部分需要用CTRL-Z(0x1A)来填充。
Xmodem通信协议实例在⼯作时串⼝通信的过程中需要传输⽂件,这⾥就就需要使⽤通信协议,此时选择的是Xmodem协议作简要研究1、什么是Xmodem协议Xmodem协议是串⼝通信中⼴泛使⽤到的异步⽂件传输协议。
以128字节块的形式传输数据,并且每个块都使⽤⼀个校验过程来进⾏错误检测。
在校验过程中如果接收⽅关于⼀个块的检验和与它在发送⽅的检验相同时,接收⽅就向发送⽅发送⼀个确认字节<ACK>。
如果有错则发送⼀个字节<NAK>要求重发。
以保证传输过程中的正确性,但是由于需要对每个块都要进⾏检验,显得效率⽐较低。
2、Xmodem协议相关控制字符SOH 0x01 //Xmodem数据头STX 0x02 //1K-Xmodem数据头EOT 0x04 //发送结束ACK 0x06 //认可响应NAK 0x15 //不认可响应CAN 0x18 //撤销传送CTRLZ 0x1A //填充数据包3、标准Xmodem协议(每个数据包含有128字节数据)帧格Xmodem包格式Byte1 Byte2 Byte3 Byte4~131 Byte132~133Start Of Header Packet Number ~(Packet Number) Packet Data 16-Bit CRCXmodem协议的传输数据单位为信息包,包含⼀个标题开始字符<SOH>或者<STX>,⼀个单字节包序号,⼀个单字节包包序号的补码,128个字节数据和⼀个双字节的CRC16校验4、数据包说明对于标准Xmodem协议来说,如果传送的⽂件不是128的整数倍,那么最后⼀个数据包的有效内容肯定⼩于帧长,不⾜的部分需要⽤CTRL-Z(0x1A)来填充5、如何启动传输Xmodem协议的传输由接收⽅启动,接收⽅向发送⽅发送"C"或者NAK(这⾥的NAK是⽤来启动传输的。
下⾯我们⽤到的NAK是⽤来对数据产⽣重传机制)。
串口通信crc校验计算
在串口通信中,CRC(循环冗余校验)是一种常用的校验方法,用于检测数据传输过程中的错误。
下面是一个简单的CRC校验计算示例,使用的是CRC-16(也称为Xmodem CRC)算法。
假设我们要发送的数据是 0x55 0x44 0x33 0x22,我们可以按照以下步骤计算CRC校验值:
1. 确定生成多项式。
在CRC-16中,常用的生成多项式是 0x1021(二进制表示为 1000000000000010000000001)。
2. 将数据左移16位,与生成多项式进行异或操作。
在本例中,数据左移后的结果为 0x55443322'00000000。
3. 将异或操作的结果与生成多项式进行模2除法,得到余数。
在本例中,余数为 0x243F(二进制表示为 1001010001111111)。
4. 将余数左移16位,与原数据拼接起来,得到CRC校验码。
在本例中,CRC校验码为 0x55443322'243F。
以上是一个简单的CRC校验计算示例,实际应用中可能需要根据具体的协议和数据进行调整。
研究Xmodem协议必看的11个问题原文地址:/s/blog_4db10c6c0100av57.html~type=v5 _one&label=rela_prevarticleXmodem协议作为串口数据传输主要的方式之一,恐怕只有做过bootloader的才有机会接触一下,网上有关该协议的内容要么是英语要么讲解不详细。
笔者以前写bootloader时研究过1k-Xmodem,参考了不少相关资料。
这里和大家交流一下我对Xmodem的理解,多多指教!1.Xmodem协议是什么?XMODEM协议是一种串口通信中广泛用到的异步文件传输协议。
分为标准X modem和1k-Xmodem两种,前者以128字节块的形式传输数据,后者字节块为1 k即1024字节,并且每个块都使用一个校验和过程来进行错误检测。
在校验过程中如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个确认字节 (ACK)。
由于Xmodem需要对每个块都进行认可,这将导致性能有所下降,特别是延时比较长的场合,这种协议显得效率更低。
除了Xmodem,还有Ymodem,Zmodem协议。
他们的协议内容和Xmodem类似,不同的是Ymodem允许批处理文件传输,效率更高;Zmodem则是改进的了X modem,它只需要对损坏的块进行重发,其它正确的块不需要发送确认字节。
减少了通信量。
2.Xmodem协议相关控制字符SOH 0x01STX 0x02EOT 0x04ACK 0x06NAK 0x15CAN 0x18CTRLZ 0x1A3.标准Xmodem协议(每个数据包含有128字节数据)帧格式_______________________________________________________________ | | || | || SOH | 信息包序号| 信息包序号的补码 | 数据区段| 校验和||_____|____________|___________________|__________|____________| 4.1k-Xmodem(每个数据包含有1024字节数据)帧格式_______________________________________________________________ | | || | || STX | 信息包序号| 信息包序号的补码 | 数据区段| 校验和||_____|____________|___________________|__________|____________| 5.数据包说明对于标准Xmodem协议来说,如果传送的文件不是128的整数倍,那么最后一个数据包的有效内容肯定小于帧长,不足的部分需要用CTRL- Z(0x1A)来填充。
Xmodem通信谢诗义1教学重点2作业2.1求0,1,2…127的CRC2.2在超级输入如下命令以便进行XMODEM接收状态,2.2.1命令:xmodemrec2.2.2完成以后,应指示XMODEM接收是否正确,及接收到文件长度2.3在超级终端下输入如下命令进入XMODEM发送状态2.3.1命令:xmodemsend2.3.2发送完成以后,应指示发送是否正确3Xmodem协议3.1Xmodem协议是一种文件传输协议,文件传输的要求3.1.1文件应分块传输,每个块有统一大小3.1.2有重传机制:当发送方发送一个块时,它会自动的在每个块后附加上几个字节的校验字段,当接收方收到该块后,会采用发送方同样的计算方法进行校验,当校验正确时,会要求发送方继续传输下一分块,当校验不正确时,会要求发送方重新传输这一分块3.1.3当文件传输结速时,应明确告诉对方:文件传输已经结束3.2内容:3.2.1Xmodem协议是什么XMODEM协议是一种串口通信中广泛用到的异步文件传输协议。
分为标准Xmodem和1k-Xmodem两种,前者以128字节块的形式传输数据,后者字节块为1k即1024字节,并且每个块都使用一个校验字段来进行错误检测。
在校验过程中如果接收方收到的校验字段与发送方传过来的的校验字段相同时,接收方就向发送方发送一个确认字节(ACK)。
除了Xmodem,还有Ymodem,Zmodem协议。
他们的协议内容和Xmodem类似,不同的是Ymodem允许批处理文件传输,效率更高;Zmodem则是改进的了Xmodem,它只需要对损坏的块进行重发,其它正确的块不需要发送确认字节。
减少了通信量3.2.2Xmodem协议相关控制字符SOH 0x01STX 0x02EOT 0x04NAK 0x15CAN 0x18CTRLZ 0x1A3.2.3标准Xmodem协议(每个数据包含有128字节数据)帧格式| SOH(1) |信息包序号(1) | 信息包序号的补码(1) | 数据区段(128) | 校验(1/2) ||_______|____________|___________________|_____________ |____________|注:每个字段后的数据表示字节数:也就是说SOH字段占一个字节,数据区字段占128字节,校验占1个或2个字段如果是和校验,校验字段是1个字节,如果是CRC校验,则是2个字节信息包的初始序号是1,第二个包的序号则是2,第255个包的下一个包的序号是0对于标准Xmodem协议来说,如果传送的文件不是128的整数倍,那么最后一个数据包的有效内容肯定小于帧长,不足的部分需要用CTRL-Z(0x1A)来填充。
3.2.41k-Xmodem(每个数据包含有1024字节数据)帧格式(除数据字段是1024字节外,其它与标准XMODEM相同)| STX (1)| 信息包序号(1) | 信息包序号的补码(1) | 数据区段(1024) | 校验(1/2)||_______|_____________|___________________|______________ |_______|3.2.5传输启动方式传输由接收方启动,方法是接收方向发送方发送"C"或者NAK(注意哦,这里提到的NAK是用来启动传输的。
以下我们会看到NAK还可以用来对数据产生重传的机制)。
当发送方收到"C"或者NAK后,才正式开始向接收方发送数据帧。
那么发‟C‟与发NAK有什么差别?接收方发送NAK信号表示接收方打算用累加和校验;接收方发送字符"C"则表示接收方打算使用CRC校验。
3.2.6传输过程当接收方发送的第一个"C"或者NAK到达发送方后,发送方认为可以发送第一个数据包,传输开始启动。
发送方接着应该将数据以每次128字节的加上包头(SOH/STX),包号,包号补码,末尾加上校验字段,打包成帧格式传送。
发送方发送了一个包后,就一直等待接收方的应答信号。
一般来说,应答信号分为三种:ACK,NAK,CANA.如果发送方收到接收方传来的ACK确认,就认为数据包被接收方正确接收,并且接收方要求发送方继续发送下一个包,此时,如果发送方还有数据要发送,那么发送方可以真真切切发送下一个包,但如果此时文件已传输完成,发送方应发送EOT(end of transmit)信号;接收方应以ACK进行确认B.如果发送方收到接收方传来的NAK(这里,NAK用来告诉发送方重传,不是用来启动传输)字节,则表示接收方请求发送方重发刚才的数据包;C.如果发送方收到接收方传来的CAN字节(cancel),则表示接收方请求无条件停止传输,发送方收到CAN后,不需要再发送EOT确认(因为接收方已经不想理它了,呵呵),3.2.7如何结束传输虽然数据包是以SOH 来标志一个信息包的起始的,但在SOH 位置上如果出现EOT则表示数据传输结束,再也没有数据传过来(所以像ACK,NAK,CAN这样的包,其包长是一个字节)3.2.8接收方如何对接收到的包进行确认接收方收到一个包之后,首先应确认数据包序号的完整性:包括两个方面:首先序号是否互补:通过对数据包序号取补,然后和数据包序号的补码异或,结果为0表示正确,结果不为0则发送NAK请求重传其次是确认数据包序号是否为期望的序号。
如果不是期望得到的数据包序号,说明发生严重错误,应该发送一个CAN 来中止传输如果接收到的数据包的包序号和前一包相同,那么接收方会忽略这个重复包,向发送方发出ACK ,准备接收下一个包。
接收方确认了信息包序号的完整性和是正确期望的后,只对128 字节的数据区段进行校验,结果与帧中最后两个字节(CRC)比较,相同发送ACK,不同即表明CRC有错误,此时应向发送方发送NAK.另外发送方发送的第一个包的序号必须是13.2.9校验和的说明Xmodem协议支持2种校验,它们是累加和与CRC校验当接收方一开始启动传输时发送的是NAK,表示它希望以累加和方式校验当接收方一开始启动传输时发送的是字符“C”,表示它希望以CRC方式校验3.3框图3.44CRC原理4.1生成多项CRC8=X8+X5+X4+1CRC-CCITT=X16+X12+X5+1CRC12=X12+X11+X3+X2+1CRC16=X16+X15+X5+1CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+14.2原理首先回想一下和校验:和校验实际上是把被校验串中的每字节加起来,和即作为此串的校验字段.CRC则是把被被校验串看成一个数,并在此数后加上两个字节的0,用此数去除以一个被称为生成多项式的一个数,其余数则作为此串的校验字段.标准xmodem的生成多项式是x16+x12+x5+1,用二进制表示则是10001000000100001 5单字节CRC计算实例5.1单字节CRC计算实例当要求一个串的CRC时,必须在此串后添加两个字节的0,然后用新生成的串去除以生成多项式(10001000000100001),所得余数则是此串的CRC,假设我们要计算数值3的CRC,必须在3后添加两个字节的010001000000100001 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<1>1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1<2>---------------------------------------------------------------------<3>1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 10 <4>1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 <5>-------------------------------------------------------------------------- <6>1 1 0 0 0 0 0 1 1 0 0 0 11 <7>0x3063<8>0x30是CRC高位,0x63是CRC的低位说明:<1>:前一组数表示生成多项式,即x16+x12+x5+1, 或者说是除数项.后一组数表示数值3后加两个0字节,表示被除数项<2>:因为除法总是从高位开始,所以这行即是<1>中的除数项<4>:表示<1>减去<2>(不过这里的减是按位异或),并补充<5>:是<1>中除数项<7>:与<4>减去<5>所得结果(不过这里的减是按位异或)<8>:把<7>中二进制化为十六进制注意:CRC是两字节的5.2单字节CRC表(此表是按上面方法计算而得)static const unsigned short T[256]= {0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0};5.36多字节CRC的算法譬如:要求X1x2....... x n-1x n的CRC时,先要在此串后加两个字节的0,即被除数为如下串X1x2....... x n-1x n0 0 <1>假设X1x2....... x n-1的CRC为crch(CRC的高字节),crcl(CRC的低字节),意味着:第<2>作为被除数,并去除以生成多项式时,其余数是crch,crclX1x2....... x n-10 0 <2>Crch crcl <3>X1x2....... x n-1x n0 <4>Crch ^x n crcl <5> X1x2....... x n-1 x n0 0 <6>Crch^x n crcl 0 <7>Crch^x n0 0 <8>T(Crch^x n) <9>Crch^x n crcl 0 <10>T(Crch^x n)^(crcl<<8) <11><1>:由于要求的是x1 x2……xn-1 xn的CRC,所认在后面加了两个字节的0作为被除数<2>与<3>:假设x1 x2 ….xn-1的CRC是Crch与crcl,注意在求CRC过程中,在x1x2 …..xn-1的后面同样加了两个0字节<4>与<5>:当<2>除以生成多项式得到的余数是Crch与crcl时,则<4>除以生成多项式得余数肯定时Crch ^ x n与crcl<6>与<7>:由于我们的被除数实现上是<6>,所以余数也变成了<7>.由于<7>是三个字节,所以可以继续被生成多项式除.<8>与<9>:当<8>作被除数时,可通过上面的表查得其余数.<10>与<11>:由<8>与<9>可推出<10>与<11>,而<10>即就是<7>,所以当被除数是<1>时,余数是<11>7递推算法unsigned short crc16_ccitt(const unsigned char *buf, int len){register int counter;register unsigned short crc = 0;for( counter = 0; counter < len; counter++)crc = T[((crc>>8) ^ *buf++) & 0xFF] ^(crc<<8);return crc;}8CRC计算实例:求0xff 0xff 两字节串的CRC9XMODEM接收流程图10XMODEM接收函数int len=0;void xmoderec(){unsigned char num=1;unsigned char arr[140];unsigned char *sp;len=0;sp=(unsigned char *)0x20000000;A T91C_BASE_SYS->ST_PIMR=0;while(1){if ((A T91C_BASE_SYS->DBGU_CSR & 0x01)==0x01)break;if ((A T91C_BASE_SYS->ST_SR & 0x01)==0x01)A T91C_BASE_SYS->DBGU_THR='C';}while(1){while((A T91C_BASE_SYS->DBGU_CSR & 0x01)==0x0);ch=A T91C_BASE_SYS->DBGU_RHR;if (ch==EOH){A T91C_BASE_SYS->DBGU_THR=ACK;return;}for(i=0;i<132;i++){while((A T91C_BASE_SYS->DBGU_CSR & 0x01)==0x0);arr[i]=A T91C_BASE_SYS->DBGU_RHR;}if ((((arr[0]^arr[1])==0xff)&&(arr[0]==num))==0){A T91C_BASE_SYS->DBGU_THR=CAN;return;}if (crc16_ccitt(&arr[2],128)!=((arr[130]<<8)+arr[131])){A T91C_BASE_SYS->DBGU_THR=NAK;}else{num++;len=len+128;for(i=0;i<128;i++){*sp++=arr[i+2];}A T91C_BASE_SYS->DBGU_THR=ACK;}}}11发送V oid xmodemsend(){Unsigned char temp;Unsigned char arr[1330];Unsigned int sendlen=0;Unsigned char I;unsigned char *sp;unsigned short crc;sp=(unsigned char *)0x20000000;While(1){While((A T91C_BASE_SYS->DBGU_CSR & 0x01)==0);Temp=A T91C_BASE_SYS->DBGU_RHR;Switch(Temp){Case …C‟:Num=1;Break;Case ack:Sendlen=sendlen+128;Num++;Break;Case nak:Break;Case can:Return;Break;Default:Break;}//组包If (sendlen>=len){A T91C_BASE_SYS->DBGU_THR=eot;Return;}Arr[0]=soh;Arr[1]=num;Arr[2]=0xff-num;For(i=0;i<128;i++){Arr[i+3]=sp[sendlen+i];}Crc= crc16_ccitt(&arr[3],128);Arr[131]=(crc>>8) & 0xff;Arr[132]=(crc & 0xff);//sendFor(i=0;i<133;i++){A T91C_BASE_SYS->DBGU_THR=arr[i];While((A T91C_BASE_SYS->DBGU_CSR & 0x02)==0);}}}12数据流数据流(data stream)最初是通信领域使用的概念,代表传输中所使用的信息的数字编码信号序列。