https://www.menie.org/georges/embedded/

需要移植如下两个基础读写函数

int _inbyte(unsigned short timeout);

void _outbyte(int c);

xmodem.c

/*
* Copyright 2001-2010 Georges Menie (www.menie.org)
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the University of California, Berkeley nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ /* this code needs standard functions memcpy() and memset()
and input/output functions _inbyte() and _outbyte(). the prototypes of the input/output functions are:
int _inbyte(unsigned short timeout); // msec timeout
void _outbyte(int c); */ #include "crc16.h" #define SOH 0x01
#define STX 0x02
#define EOT 0x04
#define ACK 0x06
#define NAK 0x15
#define CAN 0x18
#define CTRLZ 0x1A #define DLY_1S 1000
#define MAXRETRANS 25 void _outbyte(int c)
{
while ((readb(UTX1) & 0x20) == )
; writeb ((char)c,UTX1+);
} void outbyte(int c)
{
static char prev = ;
if (c < ' ' && c != '\r' && c != '\n' && c != '\t' && c != '\b')
return;
if (c == '\n' && prev != '\r') _outbyte('\r');
_outbyte(c);
prev = c;
} int _inbyte(unsigned short timeout) // msec timeout
{
unsigned short c;
int delay = timeout << ; while (((c=readw(URX1)) & 0x2000) == ) {
usleep(); /* 60 us * 16 = 960 us (~ 1 ms) */
if (timeout) {
if (--delay == ) return -;
}
} return c & 0x0FF;
} unsigned short crc16_ccitt( const void *buf, int len )
{
unsigned short crc = ;
while( len-- ) {
int i;
crc ^= *(char *)buf++ << ;
for( i = ; i < ; ++i ) {
if( crc & 0x8000 )
crc = (crc << ) ^ 0x1021;
else
crc = crc << ;
}
}
return crc;
} static int check(int crc, const unsigned char *buf, int sz)
{
if (crc) {
unsigned short crc = crc16_ccitt(buf, sz);
unsigned short tcrc = (buf[sz]<<)+buf[sz+];
if (crc == tcrc)
return ;
}
else {
int i;
unsigned char cks = ;
for (i = ; i < sz; ++i) {
cks += buf[i];
}
if (cks == buf[sz])
return ;
} return ;
} static void flushinput(void)
{
while (_inbyte(((DLY_1S)*)>>) >= )
;
} int xmodemReceive(unsigned char *dest, int destsz)
{
unsigned char xbuff[]; /* 1024 for XModem 1k + 3 head chars + 2 crc + nul */
unsigned char *p;
int bufsz, crc = ;
unsigned char trychar = 'C';
unsigned char packetno = ;
int i, c, len = ;
int retry, retrans = MAXRETRANS; for(;;) {
for( retry = ; retry < ; ++retry) {
if (trychar) _outbyte(trychar);
if ((c = _inbyte((DLY_1S)<<)) >= ) {
switch (c) {
case SOH:
bufsz = ;
goto start_recv;
case STX:
bufsz = ;
goto start_recv;
case EOT:
flushinput();
_outbyte(ACK);
return len; /* normal end */
case CAN:
if ((c = _inbyte(DLY_1S)) == CAN) {
flushinput();
_outbyte(ACK);
return -; /* canceled by remote */
}
break;
default:
break;
}
}
}
if (trychar == 'C') { trychar = NAK; continue; }
flushinput();
_outbyte(CAN);
_outbyte(CAN);
_outbyte(CAN);
return -; /* sync error */ start_recv:
if (trychar == 'C') crc = ;
trychar = ;
p = xbuff;
*p++ = c;
for (i = ; i < (bufsz+(crc?:)+); ++i) {
if ((c = _inbyte(DLY_1S)) < ) goto reject;
*p++ = c;
} if (xbuff[] == (unsigned char)(~xbuff[]) &&
(xbuff[] == packetno || xbuff[] == (unsigned char)packetno-) &&
check(crc, &xbuff[], bufsz)) {
if (xbuff[] == packetno) {
register int count = destsz - len;
if (count > bufsz) count = bufsz;
if (count > ) {
memcpy (&dest[len], &xbuff[], count);
len += count;
}
++packetno;
retrans = MAXRETRANS+;
}
if (--retrans <= ) {
flushinput();
_outbyte(CAN);
_outbyte(CAN);
_outbyte(CAN);
return -; /* too many retry error */
}
_outbyte(ACK);
continue;
}
reject:
flushinput();
_outbyte(NAK);
}
} int xmodemTransmit(unsigned char *src, int srcsz)
{
unsigned char xbuff[]; /* 1024 for XModem 1k + 3 head chars + 2 crc + nul */
int bufsz, crc = -;
unsigned char packetno = ;
int i, c, len = ;
int retry; for(;;) {
for( retry = ; retry < ; ++retry) {
if ((c = _inbyte((DLY_1S)<<)) >= ) {
switch (c) {
case 'C':
crc = ;
goto start_trans;
case NAK:
crc = ;
goto start_trans;
case CAN:
if ((c = _inbyte(DLY_1S)) == CAN) {
_outbyte(ACK);
flushinput();
return -; /* canceled by remote */
}
break;
default:
break;
}
}
}
_outbyte(CAN);
_outbyte(CAN);
_outbyte(CAN);
flushinput();
return -; /* no sync */ for(;;) {
start_trans:
xbuff[] = SOH; bufsz = ;
xbuff[] = packetno;
xbuff[] = ~packetno;
c = srcsz - len;
if (c > bufsz) c = bufsz;
if (c >= ) {
memset (&xbuff[], , bufsz);
if (c == ) {
xbuff[] = CTRLZ;
}
else {
memcpy (&xbuff[], &src[len], c);
if (c < bufsz) xbuff[+c] = CTRLZ;
}
if (crc) {
unsigned short ccrc = crc16_ccitt(&xbuff[], bufsz);
xbuff[bufsz+] = (ccrc>>) & 0xFF;
xbuff[bufsz+] = ccrc & 0xFF;
}
else {
unsigned char ccks = ;
for (i = ; i < bufsz+; ++i) {
ccks += xbuff[i];
}
xbuff[bufsz+] = ccks;
}
for (retry = ; retry < MAXRETRANS; ++retry) {
for (i = ; i < bufsz++(crc?:); ++i) {
_outbyte(xbuff[i]);
}
if ((c = _inbyte(DLY_1S)) >= ) {
switch (c) {
case ACK:
++packetno;
len += bufsz;
goto start_trans;
case CAN:
if ((c = _inbyte(DLY_1S)) == CAN) {
_outbyte(ACK);
flushinput();
return -; /* canceled by remote */
}
break;
case NAK:
default:
break;
}
}
}
_outbyte(CAN);
_outbyte(CAN);
_outbyte(CAN);
flushinput();
return -; /* xmit error */
}
else {
for (retry = ; retry < ; ++retry) {
_outbyte(EOT);
if ((c = _inbyte((DLY_1S)<<)) == ACK) break;
}
flushinput();
return (c == ACK)?len:-;
}
}
}
} #ifdef TEST_XMODEM_RECEIVE
int main(void)
{
int st; printf ("Send data using the xmodem protocol from your terminal emulator now...\n");
/* the following should be changed for your environment:
0x30000 is the download address,
65536 is the maximum size to be written at this address
*/
st = xmodemReceive((char *)0x30000, );
if (st < ) {
printf ("Xmodem receive error: status: %d\n", st);
}
else {
printf ("Xmodem successfully received %d bytes\n", st);
} return ;
}
#endif
#ifdef TEST_XMODEM_SEND
int main(void)
{
int st; printf ("Prepare your terminal emulator to receive data now...\n");
/* the following should be changed for your environment:
0x30000 is the download address,
12000 is the maximum size to be send from this address
*/
st = xmodemTransmit((char *)0x30000, );
if (st < ) {
printf ("Xmodem transmit error: status: %d\n", st);
}
else {
printf ("Xmodem successfully transmitted %d bytes\n", st);
} return ;
}
#endif

crc16.c

/*
* Copyright 2001-2010 Georges Menie (www.menie.org)
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the University of California, Berkeley nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ #include "crc16.h" /* CRC16 implementation acording to CCITT standards */ static const unsigned short crc16tab[]= {
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
}; unsigned short crc16_ccitt(const void *buf, int len)
{
register int counter;
register unsigned short crc = ;
for( counter = ; counter < len; counter++)
crc = (crc<<) ^ crc16tab[((crc>>) ^ *(char *)buf++)&0x00FF];
return crc;
}

crc16.h

/*
* Copyright 2001-2010 Georges Menie (www.menie.org)
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the University of California, Berkeley nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ #ifndef _CRC16_H_
#define _CRC16_H_ unsigned short crc16_ccitt(const void *buf, int len); #endif /* _CRC16_H_ */

附件打包下载

http://files.cnblogs.com/files/dong1/xmodem.c.zip

文件传输(xmodem协议)的更多相关文章

  1. linux rz sz文件传输 ZModem协议

    比ftp和scp方便点.需要用支持ZModem协议的工具,SecureCRT是可以的 rz: 接收文件 sz: 发送文件 安装 # sudo apt-get install lrzsz 使用 协议介绍 ...

  2. TFTP服务 简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,默认端口号为69

    (1)yum安装:tftp.tftp-server   (2)启动tftp CentOS 6 service xinetd restart chkconfig tftp on CentOS 7 sys ...

  3. Linux文件传输协议2019-7-9

    FTP(file transfer Protocol)是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20.21号端口,其中端口20(数据端口)用于数据传输,端口21(命令端口)用 ...

  4. TFTP(Trivial File Transfer Protocol,简单文件传输协议)

    TFTP(Trivial File Transfer Protocol,简单文件传输协议),是 TCP/IP 协议族中用来在客户机和服务器之间进行简单文件传输的协议,开销很小.这时候有人可能会纳闷,既 ...

  5. TFTP服务[精简版]:简单文件传输协议

    简单文件传输协议(Trivial File Transfer Protocol,TFTP)是一种基于 UDP 协议在客户端 和服务器之间进行简单文件传输的协议.顾名思义,它提供不复杂.开销不大的文件传 ...

  6. 【RL-TCPnet网络教程】第38章 TFTP简单文件传输基础知识

    第38章      TFTP简单文件传输基础知识 本章节为大家讲解TFTP(Trivial File Transfer Protocol,简单文件传输协议)的基础知识,方便后面章节的实战操作. (本章 ...

  7. FTP文件传输服务器原理

    FTP服务器,全称File Transfer Protocol Server,是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务.FTP,文件传输协议(File Transfer ...

  8. 《linux就该这么学》课堂笔记15 vsftpd文件传输、Samba/NFS文件共享

    1.为了能够在如此复杂多样的设备之间(Windows.Linux.UNIX.Mac等不同的操作系统)解决问题解决文件传输问题,文件传输协议(FTP)应运而生. FTP服务器是按照FTP协议在互联网上提 ...

  9. C#实现http协议下的多线程文件传输

    用C#实现HTTP协议下的多线程文件传输转自  http://developer.51cto.com/art/201105/263066_all.htm C#(C Sharp)是微软(Microsof ...

随机推荐

  1. 8天学通MongoDB(mark)

    转自:http://www.cnblogs.com/huangxincheng/archive/2012/02/18/2356595.html 关于mongodb的好处,优点之类的这里就不说了,唯一要 ...

  2. 错题0920-java

    1.java如何接受request域中的参数? A:request.getRequestURL() B:request. getAttribute() C:request.getParameter() ...

  3. WPF 单实例应用程序

    例如:Microsoft Word,不管打开多少个文档(也不管它们是如何打开的),一次只能加载 winword.exe 一个实例. 这便是单实例应用程序. 对于这种单实例应用程序,WPF 本身并未提供 ...

  4. Hibernate_day01--解决配置文件没有提示问题_演示常见错误

    解决配置文件没有提示问题 1 可以上网 2 把约束文件引入到eclipse中 (1)在配置文件中复制一句话 重启eclipse开发工具 演示常见错误 1 在映射配置文件中,把name属性值写错了,和实 ...

  5. ios开发之--系统控件显示中文

    虽然一直知道X-code肯定提供有语言本地化的设置地方,但是一直也做个记录,有些时候的汉化,还是需要使用代码去控制,键盘的右下角.navagiton的return使用代码修改,调用系统相机时,也是出现 ...

  6. 关于metaspolit中进行JAVA反序列化渗透RMI的原理分析

    一.背景: 这里需要对java反序列化有点了解,在这里得推广下自己的博客嘛,虽然写的不好,广告还是要做的.原谅我: 1.java反序列化漏洞原理研习 2.java反序列化漏洞的检测 二.攻击手法简介 ...

  7. JDBC通用DAO

    dbcBaseDao接口,内容如下: package com.sun4j.core.jdbc.dao; import java.io.Serializable; import java.util.Li ...

  8. js 中 this 的指向问题

    高程上的大前提: 1.this 对象是在运行时基于函数的执行环境绑定的:在全局函数中,this 等于window,而当函数被作为某个对象的方法调用时,this 等于那个对象:不过,匿名函数的执行环境具 ...

  9. Hibernate的大对象映射

    1在持久类中直接声明是java.sql.Blob类型 2在.hbm.xml文件中配置一下信息 <!-- 映射大对象 (就是字符长度超过255和图片想转换成二进制的数据)--> <!- ...

  10. Struts2---输入验证

    1. Struts2 的验证 1). 验证分为两种: > 声明式验证* 需要解决的问题如下: >> 确定对哪个 Action 或 Model 的那个字段进行验证 >> 使 ...