Xmodem协议详解以及源代码

上传人:cn****1 文档编号:559062895 上传时间:2023-03-26 格式:DOC 页数:10 大小:31.02KB
返回 下载 相关 举报
Xmodem协议详解以及源代码_第1页
第1页 / 共10页
Xmodem协议详解以及源代码_第2页
第2页 / 共10页
Xmodem协议详解以及源代码_第3页
第3页 / 共10页
Xmodem协议详解以及源代码_第4页
第4页 / 共10页
Xmodem协议详解以及源代码_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《Xmodem协议详解以及源代码》由会员分享,可在线阅读,更多相关《Xmodem协议详解以及源代码(10页珍藏版)》请在金锄头文库上搜索。

1、研究Xmodem协议必看的11个问题原文地址:http:/ 接触一下,网上有关该协议的内容要么是英语要么讲解不详细。笔者以前写bootloader时研究过1k-Xmodem,参考了不少相关资料。这里和大家交流一下我对Xmodem的理解,多多指教!1Xmodem协议是什么?XMODEM协议是一种串口通信中 广泛用到的异步文件传输协议。分为标准Xmodem和1k-Xmodem两种,前者以128字节块的形式传输数据,后者字节块为1k即1024字节,并且 每个块都使用一个校验和过程来进行错误检测。在校验过程中如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个确认字节 (A

2、CK)。由于Xmodem需要对每个块都进行认可,这将导致性能有所下降,特别是延时比较长的场合,这种协议显得效率更低。 除了Xmodem,还有Ymodem,Zmodem协议。他们的协议内容和Xmodem类似,不同的是Ymodem允许批处理文件传输,效率更高;Zmodem则是改进的了Xmodem,它只需要对损坏的块进行重发,其它正确的块不需要发送确认字节。减少了通信量。2Xmodem协议相关控制字符 SOH 0x01 STX 0x02 EOT 0x04 ACK 0x06 NAK 0x15 CAN 0x18 CTRLZ 0x1A3标准Xmodem协议(每个数据包含有128字节数据)帧格式_| | |

3、 | | | SOH | 信息包序号 |信息包序号的补码 | 数据区段|校验和 |_|_|_|_|_|41k-Xmodem(每个数据包含有1024字节数据)帧格式_| | | | | | STX | 信息包序号 |信息包序号的补码 | 数据区段|校验和 |_|_|_|_|_|5数据包说明 对于标准Xmodem协议来说,如果传送的文件不是128的整数倍,那么最后一个数据包的有效内容肯定小于帧长,不足的部分需要用CTRL- Z(0x1A)来填充。这里可能有人会问,如果我传送的是bootloader工程生成的.bin文件,mcu收到后遇到0x1A字符会怎么处理?其实如 果传送的是文本文件,那么接收方

4、对于接收的内容是很容易识别的,因为CTRL-Z不是前128个ascii码,不是通用可见字符,如果是二进制文件,mcu其实也不会把它当作代码来执行。哪怕是excel文件等,由于其内部会有些结构表示各个字段长度等,所以不会读取多余的填充字符。否则 Xmodem太弱了。对于1k-Xmodem,同上理。6如何启动传输? 传输由接收方启动,方法是向发送方发送C或者NAK(注意哦,这里提到的NAK是用来启动传输的。以下我们会看到NAK还可以用来对数据产生重传的机 制)。接收方发送NAK信号表示接收方打算用累加和校验;发送字符C则表示接收方想打算使用CRC校验(具体校验规则下文Xmodem源码,源码胜于 雄

5、辩)。7传输过程 当接收方发送的第一个C或者NAK到达发送方,发送方认为可以发送第一个数据包,传输已经启动。发送方接着应该将数据以每次128字节的数据加上包头,包号,包号补码,末尾加上校验和,打包成帧格式传送。发送方发了第一包后就等待接收方的确认字节ACK,收到接收方传来的ACK确认,就认为数据包被接收方正确接收,并且接收方要求发送方继续发送下一个包; 如果发送方收到接收方传来的NAK(这里,NAK用来告诉发送方重传,不是用来启动传输)字节,则表示接收方请求重发刚才的数据包;如果发送方收到接收方 传来的CAN字节,则表示接收方请求无条件停止传输。8如何结束传输? 如果发送方正常传输完全部数据,

6、需要结束传输,正常结束需要发送方发送EOT 字节通知接收方。接收方回以ACK进行确认。当然接收方也可强制停止传输,当接收方发送CAN 字节给发送方,表示接收方想无条件停止传输,发送方收到CAN后,不需要再发送 EOT确认(因为接收方已经不想理它了,呵呵)。9特殊处理 虽然数据包是以 SOH 来标志一个信息包的起始的,但在 SOH 位置上如果出现EOT则表示数据传输结束,再也没有数据传过来。接收方首先应确认数据包序号的完整性,通过对数据包序号取补,然后和数据包序号的补码异或,结果为0表示正确,结果不为0则发送NAK请求重传。 接收方确认数据包序号正确后,然后检查是否期望的序号。如果不是期望得到的

7、数据包序号,说明发生严重错误,应该发送一个 CAN 来中止传输。 如果接收到的数据包的包序号和前一包相同,那么接收方会忽略这个重复包,向发送方发出 ACK ,准备接收下一个包。 接收方确认了信息包序号的完整性和是正确期望的后,只对 128 字节的数据区段进行算术和校验,结果与帧中最后一个字节(算术校验和)比较,相同发送 ACK,不同发送 NAK。10校验和的说明 Xmodem协议支持2种校验和,它们是累加和与CRC校验。 当接收方一开始启动传输时发送的是NAK,表示它希望以累加和方式校验。 当接收方一开始启动传输时发送的是字符“C”,表示它希望以CRC方式校验。 可能有人会问,接收方想怎么校验

8、发送方都得配合吗,难道发送方必须都支持累加和校验和CRC校验?事实上Xmodem要求支持CRC的就必须同时支持累加 和,如果发送方只支持累加和,而接收方用字符“C”来启动,那么发送方只要不管它,当接收方继续发送“C”,三次后都没收到应答,就自动会改为发送 NAK,因为它已经明白发送方可能不支持CRC校验,现在接收方改为累加和校验和发送方通讯。发送方收到NAK就赶紧发送数据包响应。11Xmodem协议代码 看了以上说明,再参考代码,应该很容易会理解代码编写者的思路。XModem 源码#include crc16.h#define SOH 0x01#define STX 0x02#define E

9、OT 0x04#define ACK 0x06#define NAK 0x15#define CAN 0x18#define CTRLZ 0x1A#define DLY_1S 1000#define MAXRETRANS 25static int last_error = 0;#include string.hvoid port_outbyte(unsigned char trychar) unsigned char buf2; buf0 = trychar; lowLevel_write(buf,1);unsigned char port_inbyte(unsigned int time_o

10、ut) unsigned char ch; int i; last_error = 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 (crc) unsigned short crc = crc16_ccitt(buf, sz); unsigned short tcrc = (bufsz8)+bufsz+1; if (crc = tcrc) return 1; else int i;

11、 unsigned char cks = 0; for (i = 0; i 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; int i, c, len = 0; int retry, retrans = MAXRETRANS; for(;) for( retry = 0; retry 16;

12、 +retry) if (trychar) port_outbyte(trychar); c = port_inbyte(DLY_1S)1); if (last_error = 0) switch (c) case SOH: bufsz = 128; goto start_recv; case STX: bufsz = 1024; goto start_recv; case EOT: flushinput(); port_outbyte(ACK); return len; case CAN: c = port_inbyte(DLY_1S); if (c = CAN) flushinput(); port_outbyte(ACK); return -1;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 模板/表格 > 财务表格

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号