文件传输(xmodem协议)
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协议)的更多相关文章
- linux rz sz文件传输 ZModem协议
比ftp和scp方便点.需要用支持ZModem协议的工具,SecureCRT是可以的 rz: 接收文件 sz: 发送文件 安装 # sudo apt-get install lrzsz 使用 协议介绍 ...
- TFTP服务 简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,默认端口号为69
(1)yum安装:tftp.tftp-server (2)启动tftp CentOS 6 service xinetd restart chkconfig tftp on CentOS 7 sys ...
- Linux文件传输协议2019-7-9
FTP(file transfer Protocol)是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20.21号端口,其中端口20(数据端口)用于数据传输,端口21(命令端口)用 ...
- TFTP(Trivial File Transfer Protocol,简单文件传输协议)
TFTP(Trivial File Transfer Protocol,简单文件传输协议),是 TCP/IP 协议族中用来在客户机和服务器之间进行简单文件传输的协议,开销很小.这时候有人可能会纳闷,既 ...
- TFTP服务[精简版]:简单文件传输协议
简单文件传输协议(Trivial File Transfer Protocol,TFTP)是一种基于 UDP 协议在客户端 和服务器之间进行简单文件传输的协议.顾名思义,它提供不复杂.开销不大的文件传 ...
- 【RL-TCPnet网络教程】第38章 TFTP简单文件传输基础知识
第38章 TFTP简单文件传输基础知识 本章节为大家讲解TFTP(Trivial File Transfer Protocol,简单文件传输协议)的基础知识,方便后面章节的实战操作. (本章 ...
- FTP文件传输服务器原理
FTP服务器,全称File Transfer Protocol Server,是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务.FTP,文件传输协议(File Transfer ...
- 《linux就该这么学》课堂笔记15 vsftpd文件传输、Samba/NFS文件共享
1.为了能够在如此复杂多样的设备之间(Windows.Linux.UNIX.Mac等不同的操作系统)解决问题解决文件传输问题,文件传输协议(FTP)应运而生. FTP服务器是按照FTP协议在互联网上提 ...
- C#实现http协议下的多线程文件传输
用C#实现HTTP协议下的多线程文件传输转自 http://developer.51cto.com/art/201105/263066_all.htm C#(C Sharp)是微软(Microsof ...
随机推荐
- eclipse 灵活使用makefile来编译C/C++
需求: 近期在看<C++ Primer Plus>, 作者在不断优化自己的类.有很多不同的版本号,有非常多的測试函数(main函数),我使用的是eclipse+CDT来编写C++,不可能为 ...
- C++ 类的抽象初练
/* 某商店经销一种货物,货物的购进和卖出以箱为单位,各箱的重量不一样, 因此商店需要目前库存的总重量. 现在用c++模拟商店货物购进和卖出的情况 */ #include<iostream> ...
- VMware ESXi 启动时提示引导错误:不是VMware引导槽。找不到管理程序(bank6 not a vmware boot bank no hypervisor found)
VMware ESXi 启动时提示引导错误: bank6 not a vmware boot bank no hypervisor found 大概中文意思是:不是VMware引导槽.找不到管理程序. ...
- 【BZOJ】1679: [Usaco2005 Jan]Moo Volume 牛的呼声(数学)
http://www.lydsy.com/JudgeOnline/problem.php?id=1679 水题没啥好说的..自己用笔画画就懂了 将点排序,然后每一次的点到后边点的声音距离和==(n-i ...
- 在Chem 3D软件用什么方法可以改变背景
化学绘图过程中常常需要绘制三维结构的图形,Chem 3D软件是ChemOffice套件中专门用于绘制三维结构的组件.用过它的用户会发现,其背景颜色通常都默认为深蓝色,但是不是每个场景都适合用深蓝色的背 ...
- 数据库unsigned char*类型图片存进
loadimage1();测试: void Caccess_test_1Dlg::loadimage1()//存入unsigned char*类型的数据图片 { CFileException e; I ...
- Effective C++ Item 9 Never call virtual functions during constrution or destruction
Because such calls would never go to a more derived class than that of currently executing construto ...
- [Domino]从嵌入另一个数据库嵌入的Embedded View无法正常显示,提示unable to lauch
发现问题 1. 项目中需要在一个数据库中插入另一个数据库的Embedded View,使用起来十分费劲,在选择数据库的下拉菜单中经常会找不到目标数据库: 2. 在做日文版的时候,从workbench导 ...
- HDU_5533_Dancing Stars on Me
Dancing Stars on Me Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Ot ...
- Notice: Undefined index: wjs_cookie
w执行顺序. ok <!doctype html> <html> <head> <meta charset="UTF-8"> < ...