Xmodem协议详解以及源代码_第1页
Xmodem协议详解以及源代码_第2页
Xmodem协议详解以及源代码_第3页
Xmodem协议详解以及源代码_第4页
Xmodem协议详解以及源代码_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、研究 Xmodem 协议必看的 11个问题Xmodem 协议作为串口数据传输主要的方式之一,恐怕只有做过 bootloader 的才有机会 接 触一下, 网上有关该协议的内容要么是英语要么讲解不详细。 笔者以前写 bootloader 时研究 过 1k-Xmodem ,参考了不少相关资料。这里和大家交流一下我对 Xmodem 的理解,多多指 教!1. Xmodem 协议是什么?XMODEM协议是一种串口通信中 广泛用到的异步文件传输协议。分为标准 Xmodem 和 1k-Xmodem 两种,前者以 128字节块的形式传输数据,后者字节块为 1k 即 1024字节,并 且 每个块都使用一个校验和

2、过程来进行错误检测。在校验过程中如果接收方关于一个块的 校验和与它在发送方的校验和相同时,接收方就向发送方发送一个确认字节 (ACK。由于 Xmodem 需要对每个块都进行认可, 这将导致性能有所下降, 特别是延时比较长的场合, 这 种协议显得效率更低。除了 Xmodem ,还有 Ymodem , Zmodem 协议。他们的协议内容和 Xmodem 类似,不同的 是 Ymodem 允许批处理文件传输,效率更高; Zmodem 则是改进的了 Xmodem ,它只需要对 损坏的块进行重发,其它正确的块不需要发送确认字节。减少了通信量。2. Xmodem 协议相关控制字符SOH 0x01STX 0x

3、02EOT 0x04ACK 0x06NAK 0x15CAN 0x18CTRLZ 0x1A3.标准 Xmodem 协议(每个数据包含有 128字节数据帧格式_| SOH | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和 |_|_|_|_|_|4. 1k-Xmodem (每个数据包含有 1024字节数据帧格式_| STX | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和 |_|_|_|_|_|5.数据包说明对于标准 Xmodem 协议来说,如果传送的文件不是 128的整数倍,那么最后一个数据包的 有效内容肯定小于帧长,不足的部分需要用 CTRL- Z(0x1A来填充。这

4、里可能有人会问,如果 我传送的是 bootloader 工程生成的 .bin 文件, mcu 收到后遇到 0x1A 字符会怎么处理?其实 如 果传送的是文本文件,那么接收方对于接收的内容是很容易识别的,因为 CTRL-Z 不是前 128个 ascii 码, 不是通用可见字符, 如果是二进制文件, mcu 其实也不会把它当作代码来执 行。哪怕是 excel 文件等,由于其内部会有些结构表示各个字段长度等,所以不会读取多余 的填充字符。否则 Xmodem太弱了。对于 1k-Xmodem ,同上理。6.如何启动传输?传输由接收方启动,方法是向发送方发送 "C" 或者 NAK(注意

5、哦,这里提到的 NAK 是用来启 动传输的。 以下我们会看到 NAK 还可以用来对数据产生重传的机 制 。 接收方发送 NAK 信号 表示接收方打算用累加和校验;发送字符 "C" 则表示接收方想打算使用 CRC 校验(具体校验 规则下文 Xmodem 源码,源码胜于 雄辩 。7.传输过程当接收方发送的第一个 "C" 或者 NAK 到达发送方,发送方认为可以发送第一个数据包,传 输已经启动。 发送方接着应该将数据以每次 128字节的数据加上包头,包号,包号补码, 末 尾加上校验和,打包成帧格式传送。 发送方发了第一包后就等待接收方的确认字节 ACK , 收

6、到接收方传来的 ACK 确认,就认为数据包被接收方正确接收,并且接收方要求发送方继 续发送下一个包; 如果发送方收到接收方传来的 NAK(这里, NAK 用来告诉发送方重传,不 是用来启动传输 字节,则表示接收方请求重发刚才的数据包;如果发送方收到接收方 传来 的 CAN 字节,则表示接收方请求无条件停止传输。8.如何结束传输?如果发送方正常传输完全部数据, 需要结束传输, 正常结束需要发送方发送 EOT 字节通知 接收方。接收方回以 ACK 进行确认。当然接收方也可强制停止传输,当接收方发送 CAN 字 节给发送方,表示接收方想无条件停止传输,发送方收到 CAN 后,不需要再发送 EOT确认

7、 (因为接收方已经不想理它了,呵呵 。9.特殊处理虽然数据包是以 SOH 来标志一个信息包的起始的,但在 SOH 位置上如果出现 EOT 则表示 数据传输结束,再也没有数据传过来。接收方首先应确认数据包序号的完整性, 通过对数据包序号取补, 然后和数据包序号的补码 异或,结果为 0表示正确,结果不为 0则发送 NAK 请求重传。 接收方确认数据包序号正 确后, 然后检查是否期望的序号。如果不是期望得到的数据包序号,说明发生严重错误,应 该发送一个 CAN 来中止传输。 如果接收到的数据包的包序号和前一包相同,那么接收方 会忽略这个重复包,向发送方发出 ACK ,准备接收下一个包。接收方确认了信

8、息包序号的完整性和是正确期望的后, 只对 128 字节的数据区段进行算术 和校验,结果与帧中最后一个字节(算术校验和比较,相同发送 ACK,不同发送 NAK。 10.校验和的说明Xmodem协议支持 2种校验和,它们是累加和与 CRC 校验。当接收方一开始启动传输时发送的是 NAK , 表示它希望以累加和方式校验。 当接收方一 开始启动传输时发送的是字符“ C ” ,表示它希望以 CRC 方式校验。可能有人会问,接收方想怎么校验发送方都得配合吗,难道发送方必须都支持累加和校 验和 CRC 校验?事实上 Xmodem 要求支持 CRC 的就必须同时支持累加 和,如果发送方只支 持累加和, 而接收

9、方用字符 “ C ” 来启动, 那么发送方只要不管它, 当接收方继续发送 “ C ” , 三次后都没收到应答,就自动会改为发送 NAK,因为它已经明白发送方可能不支持 CRC 校 验,现在接收方改为累加和校验和发送方通讯。发送方收到 NAK 就赶紧发送数据包响应。 11. Xmodem 协议代码看了以上说明,再参考代码,应该很容易会理解代码编写者的思路。XModem 源码#include "crc16.h"#define SOH 0x01#define STX 0x02#define EOT 0x04#define ACK 0x06#define NAK 0x15#defi

10、ne CAN 0x18#define CTRLZ 0x1A#define DLY_1S 1000#define MAXRETRANS 25static int last_error = 0;#include "string.h"void port_outbyte(unsigned char trycharunsigned char buf2;buf0 = trychar;lowLevel_write(buf,1;unsigned char port_inbyte(unsigned int time_out unsigned char ch; int i;last_error

11、 = 0;if(lowLevel_read(&ch,1 = 1 return ch;last_error = 1;return ch;static int check(int crc, const unsigned char *buf, int sz if (crcunsigned short crc = crc16_ccitt(buf, sz; unsigned short tcrc = (bufsz<<8+bufsz+1; if (crc = tcrc return 1;elseint i;unsigned char cks = 0;for (i = 0; i <

12、 sz; +icks += bufi;if (cks = bufsz return 1;return 0;static void flushinput(void/while (port_inbyte(DLY_1S*3>>1 >= 0 ; int xmodemReceive(unsigned char *dest, int destsz unsigned char xbuff1030;unsigned char *p;int bufsz, crc = 0;unsigned char trychar = 'C'unsigned char packetno = 1;

13、int i, c, len = 0;int retry, retrans = MAXRETRANS;for(;for( retry = 0; retry < 16; +retryif (trycharport_outbyte(trychar;c = port_inbyte(DLY_1S<<1;if (last_error = 0switch (ccase SOH:bufsz = 128;goto start_recv;case STX:bufsz = 1024;goto start_recv;case EOT:flushinput(;port_outbyte(ACK; ret

14、urn len;case CAN:c = port_inbyte(DLY_1S; if (c = CANflushinput(;port_outbyte(ACK; return -1;break;default:break;if (trychar = 'C'trychar = NAK;continue;flushinput(;port_outbyte(CAN;port_outbyte(CAN;port_outbyte(CAN;return -2;start_recv:if (trychar = 'C'crc = 1;trychar = 0;p = xbuff;*

15、p+ = c;for (i = 0; i < (bufsz+(crc?1:0+3; +ic = port_inbyte(DLY_1S;if (last_error != 0goto reject;*p+ = c;if (xbuff1 = (unsigned char(xbuff2 &&(xbuff1 = packetno | xbuff1 = (unsigned charpacketno-1 && check(crc, &xbuff3, bufszif (xbuff1 = packetnoint count = destsz - len;if (c

16、ount > bufszcount = bufsz;if (count > 0memcpy (&destlen, &xbuff3, count;len += count;+packetno;retrans = MAXRETRANS+1;if (-retrans <= 0flushinput(;port_outbyte(CAN;port_outbyte(CAN;port_outbyte(CAN; return -3; port_outbyte(ACK; continue; reject: flushinput(; port_outbyte(NAK; int xm

17、odemTransmit(unsigned char *src, int srcsz unsigned char xbuff1030; int bufsz, crc = -1; unsigned char packetno = 1; int i, c, len = 0; int retry; for(; for( retry = 0; retry < 16; +retry c = port_inbyte(DLY_1S<<1; if (last_error = 0 switch (c case 'C': crc = 1; goto start_trans; ca

18、se NAK: crc = 0; goto start_trans; case CAN: c = port_inbyte(DLY_1S; if (c = CAN port_outbyte(ACK; flushinput(; return -1; break; default: break; port_outbyte(CAN; port_outbyte(CAN; port_outbyte(CAN; flushinput(; return -2; for(; start_trans: xbuff0 = SOH; bufsz = 128; xbuff1 = packetno; xbuff2 = pa

19、cketno; c = srcsz - len; if (c > bufsz c = bufsz; if (c >= 0 memset (&xbuff3, 0, bufsz; if (c = 0 xbuff3 = CTRLZ; else memcpy (&xbuff3, &srclen, c; if (c < bufsz xbuff3+c = CTRLZ; if (crc unsigned short ccrc = crc16_ccitt(&xbuff3, bufsz; xbuffbufsz+3 = (ccrc>>8 & 0xFF; xbuffbufsz+4 = ccrc & 0xFF; else unsigned char cc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论