1 / 19
文档名称:

Xmodem协议详解以及源代码.doc

格式:doc   大小:3,810KB   页数:19页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Xmodem协议详解以及源代码.doc

上传人:布罗奇迹 2024/5/10 文件大小:3.72 MB

下载得到文件列表

Xmodem协议详解以及源代码.doc

相关文档

文档介绍

文档介绍:该【Xmodem协议详解以及源代码 】是由【布罗奇迹】上传分享,文档一共【19】页,该文档可以免费在线阅读,需要了解更多关于【Xmodem协议详解以及源代码 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。Xmodem协议详解以及源代码研究Xmodem协议必看的11个问题原文地址:http://blog./s/~type=v5_one&label=rela_prevarticleXmodem协议作为串口数据传输主要的方式之一,恐怕只有做过bootloader的才有机会接触一下,网上有关该协议的内容要么是英语要么讲解不详细。笔者以前写bootloader时研究过1k-Xmodem,参考了不少相关资料。这里和大家交流一下我对Xmodem的理解,多多指教!? XMODEM协议是一种串口通信中广泛用到的异步文件传输协议。分为标准Xmodem和1k-Xmodem两种,前者以128字节块的形式传输数据,后者字节块为1k即1024字节,并且每个块都使用一个校验和过程来进行错误检测。在校验过程中如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个确认字节(ACK)。由于Xmodem需要对每个块都进行认可,这将导致性能有所下降,特别是延时比较长的场合,这种协议显得效率更低。??除了Xmodem,还有Ymodem,Zmodem协议。他们的协议内容和Xmodem类似,不同的是Ymodem允许批处理文件传输,效率更高;Zmodem则是改进的了Xmodem,它只需要对损坏的块进行重发,其它正确的块不需要发送确认字节。减少了通信量。??SOH????????0x01??STX??????0x02??EOT????????0x04??ACK????????0x06??NAK????????0x15??CAN????????0x18??CTRLZ????(每个数据包含有128字节数据)帧格式??_______________________________________________________________|????|????????|????????????|??????|????????||SOH|信息包序号??|??信息包序号的补码??|数据区段??|??校验和????||_____|____________|___________________|__________|____________|-Xmodem(每个数据包含有1024字节数据)帧格式??_______________________________________________________________|????|????????|????????????|??????|????????||STX|信息包序号??|??信息包序号的补码??|数据区段??|??校验和????|??当接收方一开始启动传输时发送的是NAK,表示它希望以累加和方式校验。??当接收方一开始启动传输时发送的是字符“C”,表示它希望以CRC方式校验。??可能有人会问,接收方想怎么校验发送方都得配合吗,难道发送方必须都支持累加和校验和CRC校验?事实上Xmodem要求支持CRC的就必须同时支持累加和,如果发送方只支持累加和,而接收方用字符“C”来启动,那么发送方只要不管它,当接收方继续发送“C”,三次后都没收到应答,就自动会改为发送NAK,因为它已经明白发送方可能不支持CRC校验,现在接收方改为累加和校验和发送方通讯。发送方收到NAK就赶紧发送数据包响应。????看了以上说明,再参考代码,应该很容易会理解代码编写者的思路。XModem源码#include""#defineSOH0x01#defineSTX0x02#defineEOT0x04#defineACK0x06#defineNAK0x15#defineCAN0x18#defineCTRLZ0x1A#defineDLY_1S1000#defineMAXRETRANS25staticintlast_error=0;#include""voidport_outbyte(unsignedchartrychar){unsignedcharbuf[2];buf[0]=trychar;lowLevel_write(buf,1);}unsignedcharport_inbyte(unsignedinttime_out){unsignedcharch;inti;last_error=0;if(lowLevel_read(&ch,1)==1)returnch;last_error=1;returnch;}staticintcheck(intcrc,constunsignedchar*buf,intsz){if(crc){unsignedshortcrc=itt(buf,sz);unsignedshorttcrc=(buf[sz]<<8)+buf[sz+1];if(crc==tcrc)return1;}else{inti;unsignedcharcks=0;for(i=0;i<sz;++i){cks+=buf[i];}if(cks==buf[sz])return1;}return0;}staticvoidflushinput(void){//while(port_inbyte(((DLY_1S)*3)>>1)>=0);}intxmodemReceive(unsignedchar*dest,intdestsz){unsignedcharxbuff[1030];unsignedchar*p;intbufsz,crc=0;unsignedchartrychar='C';unsignedcharpacketno=1;inti,c,len=0;intretry,retrans=MAXRETRANS;for(;;){for(retry=0;retry<16;++retry){if(trychar)port_outbyte(trychar);c=port_inbyte((DLY_1S)<<1);if(last_error==0){switch(c){caseSOH:bufsz=128;gotostart_recv;caseSTX:bufsz=1024;gotostart_recv;caseEOT:flushinput();port_outbyte(ACK);returnlen;caseCAN:c=port_inbyte(DLY_1S);if(c==CAN){flushinput();port_outbyte(ACK);return-1;}break;default:break;