⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zm.c

📁 开源串口利用Xmodem,Ymodem,ZModem 下载,上传的程序.在Linux,Arm-Linux 都可使用
💻 C
📖 第 1 页 / 共 2 页
字号:
				goto fifi;			default:				goto agn2;			}		case RCDO:			goto fifi;		default:			break;		case CAN:			if (--cancount <= 0) {				c = ZCAN; goto fifi;			}			goto again;		}	/* **** FALL THRU TO **** */	default:agn2:		if ( --n == 0) {			c = GCOUNT;  goto fifi;		}		goto startover;	case ZPAD:		/* This is what we want. */		break;	}	cancount = 5;splat:	switch (c = noxrd7()) {	case ZPAD:		goto splat;	case RCDO:	case TIMEOUT:		goto fifi;	default:		goto agn2;	case ZDLE:		/* This is what we want. */		break;	}	Rxhlen = 4;		/* Set default length */	Rxframeind = c = noxrd7();	switch (c) {	case ZVBIN32:		if ((Rxhlen = c = zdlread()) < 0)			goto fifi;		if (c > ZMAXHLEN)			goto agn2;		Crc32r = 1;  c = zrbhd32(hdr); break;	case ZBIN32:		if (Usevhdrs)			goto agn2;		Crc32r = 1;  c = zrbhd32(hdr); break;	case ZVBINR32:		if ((Rxhlen = c = zdlread()) < 0)			goto fifi;		if (c > ZMAXHLEN)			goto agn2;		Crc32r = 2;  c = zrbhd32(hdr); break;	case ZBINR32:		if (Usevhdrs)			goto agn2;		Crc32r = 2;  c = zrbhd32(hdr); break;	case RCDO:	case TIMEOUT:		goto fifi;	case ZVBIN:		if ((Rxhlen = c = zdlread()) < 0)			goto fifi;		if (c > ZMAXHLEN)			goto agn2;		Crc32r = 0;  c = zrbhdr(hdr); break;	case ZBIN:		if (Usevhdrs)			goto agn2;		Crc32r = 0;  c = zrbhdr(hdr); break;	case ZVHEX:		if ((Rxhlen = c = zgethex()) < 0)			goto fifi;		if (c > ZMAXHLEN)			goto agn2;		Crc32r = 0;  c = zrhhdr(hdr); break;	case ZHEX:		if (Usevhdrs)			goto agn2;		Crc32r = 0;  c = zrhhdr(hdr); break;	case CAN:		goto gotcan;	default:		goto agn2;	}	for (n = Rxhlen; ++n < ZMAXHLEN; )	/* Clear unused hdr bytes */		hdr[n] = 0;	Rxpos = hdr[ZP3] & 0377;	Rxpos = (Rxpos<<8) + (hdr[ZP2] & 0377);	Rxpos = (Rxpos<<8) + (hdr[ZP1] & 0377);	Rxpos = (Rxpos<<8) + (hdr[ZP0] & 0377);fifi:	switch (c) {	case GOTCAN:		c = ZCAN;	/* **** FALL THRU TO **** */	case ZNAK:	case ZCAN:	case ERROR:	case TIMEOUT:	case RCDO:	case GCOUNT:		zperr2("Got %s", frametypes[c+FTOFFSET]);	/* **** FALL THRU TO **** */#ifndef DSZ	default:		if (c >= -4 && c <= FRTYPES)			vfile("zgethdr: %c %d %s %lx", Rxframeind, Rxhlen,			  frametypes[c+FTOFFSET], Rxpos);		else			vfile("zgethdr: %c %d %lx", Rxframeind, c, Rxpos);#endif	}	/* Use variable length headers if we got one */	if (c >= 0 && c <= FRTYPES && Rxframeind & 040)		Usevhdrs = 1;	return c;}/* Receive a binary style header (type and position) */zrbhdr(hdr)register char *hdr;{	register int c, n;	register unsigned short crc;	if ((c = zdlread()) & ~0377)		return c;	Rxtype = c;	crc = updcrc(c, 0);	for (n=Rxhlen; --n >= 0; ++hdr) {		if ((c = zdlread()) & ~0377)			return c;		crc = updcrc(c, crc);		*hdr = c;	}	if ((c = zdlread()) & ~0377)		return c;	crc = updcrc(c, crc);	if ((c = zdlread()) & ~0377)		return c;	crc = updcrc(c, crc);	if (crc & 0xFFFF) {		zperr1(badcrc);		return ERROR;	}#ifdef ZMODEM	Protocol = ZMODEM;#endif	Zmodem = 1;	return Rxtype;}/* Receive a binary style header (type and position) with 32 bit FCS */zrbhd32(hdr)register char *hdr;{	register int c, n;	register unsigned long crc;	if ((c = zdlread()) & ~0377)		return c;	Rxtype = c;	crc = 0xFFFFFFFFL; crc = UPDC32(c, crc);#ifdef DEBUGZ	vfile("zrbhd32 c=%X  crc=%lX", c, crc);#endif	for (n=Rxhlen; --n >= 0; ++hdr) {		if ((c = zdlread()) & ~0377)			return c;		crc = UPDC32(c, crc);		*hdr = c;#ifdef DEBUGZ		vfile("zrbhd32 c=%X  crc=%lX", c, crc);#endif	}	for (n=4; --n >= 0;) {		if ((c = zdlread()) & ~0377)			return c;		crc = UPDC32(c, crc);#ifdef DEBUGZ		vfile("zrbhd32 c=%X  crc=%lX", c, crc);#endif	}	if (crc != 0xDEBB20E3) {		zperr1(badcrc);		return ERROR;	}#ifdef ZMODEM	Protocol = ZMODEM;#endif	Zmodem = 1;	return Rxtype;}/* Receive a hex style header (type and position) */zrhhdr(hdr)char *hdr;{	register int c;	register unsigned short crc;	register int n;	if ((c = zgethex()) < 0)		return c;	Rxtype = c;	crc = updcrc(c, 0);	for (n=Rxhlen; --n >= 0; ++hdr) {		if ((c = zgethex()) < 0)			return c;		crc = updcrc(c, crc);		*hdr = c;	}	if ((c = zgethex()) < 0)		return c;	crc = updcrc(c, crc);	if ((c = zgethex()) < 0)		return c;	crc = updcrc(c, crc);	if (crc & 0xFFFF) {		zperr1(badcrc); return ERROR;	}	c = readline(Rxtimeout);	if (c < 0)		return c;	c = readline(Rxtimeout);#ifdef ZMODEM	Protocol = ZMODEM;#endif	Zmodem = 1;	if (c < 0)		return c;	return Rxtype;}/* Send a byte as two hex digits */zputhex(c)register int c;{	static char	digits[]	= "0123456789abcdef";#ifdef DEBUGZ	if (Verbose>8)		vfile("zputhex: %02X", c);#endif	sendline(digits[(c&0xF0)>>4]);	sendline(digits[(c)&0xF]);}/* * Send character c with ZMODEM escape sequence encoding. */zsendline(c)register c;{	switch (c &= 0377) {	case 0377:		lastsent = c;		if (Zctlesc || Zsendmask[32]) {			xsendline(ZDLE);  c = ZRUB1;		}		xsendline(c);		break;	case ZDLE:		xsendline(ZDLE);  xsendline (lastsent = (c ^= 0100));		break;	case 021: case 023:	case 0221: case 0223:		xsendline(ZDLE);  c ^= 0100;  xsendline(lastsent = c);		break;	default:		if (((c & 0140) == 0) && (Zctlesc || Zsendmask[c & 037])) {			xsendline(ZDLE);  c ^= 0100;		}		xsendline(lastsent = c);	}}/* Decode two lower case hex digits into an 8 bit byte value */zgethex(){	register int c;	c = zgeth1();#ifdef DEBUGZ	if (Verbose>8)		vfile("zgethex: %02X", c);#endif	return c;}zgeth1(){	register int c, n;	if ((c = noxrd7()) < 0)		return c;	n = c - '0';	if (n > 9)		n -= ('a' - ':');	if (n & ~0xF)		return ERROR;	if ((c = noxrd7()) < 0)		return c;	c -= '0';	if (c > 9)		c -= ('a' - ':');	if (c & ~0xF)		return ERROR;	c += (n<<4);	return c;}/* * Read a byte, checking for ZMODEM escape encoding *  including CAN*5 which represents a quick abort */zdlread(){	register int c;again:	/* Quick check for non control characters */	if ((c = readline(Rxtimeout)) & 0140)		return c;	switch (c) {	case ZDLE:		break;	case 023:	case 0223:	case 021:	case 0221:		goto again;	default:		if (Zctlesc && !(c & 0140)) {			goto again;		}		return c;	}again2:	if ((c = readline(Rxtimeout)) < 0)		return c;	if (c == CAN && (c = readline(Rxtimeout)) < 0)		return c;	if (c == CAN && (c = readline(Rxtimeout)) < 0)		return c;	if (c == CAN && (c = readline(Rxtimeout)) < 0)		return c;	switch (c) {	case CAN:		return GOTCAN;	case ZCRCE:	case ZCRCG:	case ZCRCQ:	case ZCRCW:		return (c | GOTOR);	case ZRUB0:		return 0177;	case ZRUB1:		return 0377;	case 023:	case 0223:	case 021:	case 0221:		goto again2;	default:		if (Zctlesc && ! (c & 0140)) {			goto again2;		}		if ((c & 0140) ==  0100)			return (c ^ 0100);		break;	}	if (Verbose>1)		zperr2("Bad escape sequence %x", c);	return ERROR;}/* * Read a character from the modem line with timeout. *  Eat parity, XON and XOFF characters. */noxrd7(){	register int c;	for (;;) {		if ((c = readline(Rxtimeout)) < 0)			return c;		switch (c &= 0177) {		case XON:		case XOFF:			continue;		default:			if (Zctlesc && !(c & 0140))				continue;		case '\r':		case '\n':		case ZDLE:			return c;		}	}	/* NOTREACHED */}/* Store long integer pos in Txhdr */stohdr(pos)long pos;{	Txhdr[ZP0] = pos;	Txhdr[ZP1] = pos>>8;	Txhdr[ZP2] = pos>>16;	Txhdr[ZP3] = pos>>24;}/* Recover a long integer from a header */longrclhdr(hdr)register char *hdr;{	register long l;	l = (hdr[ZP3] & 0377);	l = (l << 8) | (hdr[ZP2] & 0377);	l = (l << 8) | (hdr[ZP1] & 0377);	l = (l << 8) | (hdr[ZP0] & 0377);	return l;}/* End of zm.c */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -