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

📄 rzsz.sh

📁 Linux下基于Z-MODEM的串口通讯程序源码
💻 SH
📖 第 1 页 / 共 5 页
字号:
X		}X		elseX			xsendline(ZBIN);X		zsendline(type);X		crc = updcrc(type, 0);XX		for (n=len; --n >= 0; ++hdr) {X			zsendline(*hdr);X			crc = updcrc((0377& *hdr), crc);X		}X		crc = updcrc(0,updcrc(0,crc));X		zsendline(((int)(crc>>8)));X		zsendline(crc);X	}X	if (type != ZDATA)X		flushmo();}XX/* Send ZMODEM binary header hdr of type type */zsbh32(len, hdr, type, flavour)register char *hdr;{X	register int n;X	register unsigned long crc;XX	xsendline(flavour); X	if (Usevhdrs) X		zsendline(len);X	zsendline(type);X	crc = 0xFFFFFFFFL; crc = UPDC32(type, crc);XX	for (n=len; --n >= 0; ++hdr) {X		crc = UPDC32((0377 & *hdr), crc);X		zsendline(*hdr);X	}X	crc = ~crc;X	for (n=4; --n >= 0;) {X		zsendline((int)crc);X		crc >>= 8;X	}}X/* Send ZMODEM HEX header hdr of type type */zshhdr(len, type, hdr)register char *hdr;{X	register int n;X	register unsigned short crc;X#ifndef DSZX	vfile("zshhdr: %c %d %s %lx", Usevhdrs?'v':'f', len,X	  frametypes[type+FTOFFSET], rclhdr(hdr));#endifX	sendline(ZPAD); sendline(ZPAD); sendline(ZDLE);X	if (Usevhdrs) {X		sendline(ZVHEX);X		zputhex(len);X	}X	elseX		sendline(ZHEX);X	zputhex(type);X	Crc32t = 0;XX	crc = updcrc(type, 0);X	for (n=len; --n >= 0; ++hdr) {X		zputhex(*hdr); crc = updcrc((0377 & *hdr), crc);X	}X	crc = updcrc(0,updcrc(0,crc));X	zputhex(((int)(crc>>8))); zputhex(crc);XX	/* Make it printable on remote machine */X	sendline(015); sendline(0212);X	/*X	 * Uncork the remote in case a fake XOFF has stopped data flowX	 */X	if (type != ZFIN && type != ZACK)X		sendline(021);X	flushmo();}X/*X * Send binary array buf of length length, with ending ZDLE sequence frameendX */static char *Zendnames[] = { "ZCRCE", "ZCRCG", "ZCRCQ", "ZCRCW"};zsdata(buf, length, frameend)register char *buf;{X	register unsigned short crc;X#ifndef DSZX	vfile("zsdata: %d %s", length, Zendnames[frameend-ZCRCE&3]);#endifX	switch (Crc32t) {X	case 1:X		zsda32(buf, length, frameend);  break;X	case 2:X		zsdar32(buf, length, frameend);  break;X	default:X		crc = 0;X		for (;--length >= 0; ++buf) {X			zsendline(*buf); crc = updcrc((0377 & *buf), crc);X		}X		xsendline(ZDLE); xsendline(frameend);X		crc = updcrc(frameend, crc);XX		crc = updcrc(0,updcrc(0,crc));X		zsendline(((int)(crc>>8))); zsendline(crc);X	}X	if (frameend == ZCRCW)X		xsendline(XON);X	if (frameend != ZCRCG)X		flushmo();}Xzsda32(buf, length, frameend)register char *buf;{X	register int c;X	register unsigned long crc;XX	crc = 0xFFFFFFFFL;X	for (;--length >= 0; ++buf) {X		c = *buf & 0377;X		zsendline(c);X		crc = UPDC32(c, crc);X	}X	xsendline(ZDLE); xsendline(frameend);X	crc = UPDC32(frameend, crc);XX	crc = ~crc;X	for (c=4; --c >= 0;) {X		zsendline((int)crc);  crc >>= 8;X	}}X/*X * Receive array buf of max length with ending ZDLE sequenceX *  and CRC.  Returns the ending character or error code.X *  NB: On errors may store length+1 bytes!X */zrdata(buf, length)register char *buf;{X	register int c;X	register unsigned short crc;X	register char *end;X	register int d;XX	switch (Crc32r) {X	case 1:X		return zrdat32(buf, length);X	case 2:X		return zrdatr32(buf, length);X	}XX	crc = Rxcount = 0;  end = buf + length;X	while (buf <= end) {X		if ((c = zdlread()) & ~0377) {crcfoo:X			switch (c) {X			case GOTCRCE:X			case GOTCRCG:X			case GOTCRCQ:X			case GOTCRCW:X				crc = updcrc((d=c)&0377, crc);X				if ((c = zdlread()) & ~0377)X					goto crcfoo;X				crc = updcrc(c, crc);X				if ((c = zdlread()) & ~0377)X					goto crcfoo;X				crc = updcrc(c, crc);X				if (crc & 0xFFFF) {X					zperr1(badcrc);X					return ERROR;X				}X				Rxcount = length - (end - buf);#ifndef DSZX				vfile("zrdata: %d  %s", Rxcount,X				 Zendnames[d-GOTCRCE&3]);#endifX				return d;X			case GOTCAN:X				zperr1("Sender Canceled");X				return ZCAN;X			case TIMEOUT:X				zperr1("TIMEOUT");X				return c;X			default:X				garbitch(); return c;X			}X		}X		*buf++ = c;X		crc = updcrc(c, crc);X	}#ifdef DSZX	garbitch(); #elseX	zperr1("Data subpacket too long");#endifX	return ERROR;}Xzrdat32(buf, length)register char *buf;{X	register int c;X	register unsigned long crc;X	register char *end;X	register int d;XX	crc = 0xFFFFFFFFL;  Rxcount = 0;  end = buf + length;X	while (buf <= end) {X		if ((c = zdlread()) & ~0377) {crcfoo:X			switch (c) {X			case GOTCRCE:X			case GOTCRCG:X			case GOTCRCQ:X			case GOTCRCW:X				d = c;  c &= 0377;X				crc = UPDC32(c, crc);X				if ((c = zdlread()) & ~0377)X					goto crcfoo;X				crc = UPDC32(c, crc);X				if ((c = zdlread()) & ~0377)X					goto crcfoo;X				crc = UPDC32(c, crc);X				if ((c = zdlread()) & ~0377)X					goto crcfoo;X				crc = UPDC32(c, crc);X				if ((c = zdlread()) & ~0377)X					goto crcfoo;X				crc = UPDC32(c, crc);X				if (crc != 0xDEBB20E3) {X					zperr1(badcrc);X					return ERROR;X				}X				Rxcount = length - (end - buf);#ifndef DSZX				vfile("zrdat32: %d %s", Rxcount,X				 Zendnames[d-GOTCRCE&3]);#endifX				return d;X			case GOTCAN:X				zperr1("Sender Canceled");X				return ZCAN;X			case TIMEOUT:X				zperr1("TIMEOUT");X				return c;X			default:X				garbitch(); return c;X			}X		}X		*buf++ = c;X		crc = UPDC32(c, crc);X	}X	zperr1("Data subpacket too long");X	return ERROR;}Xgarbitch(){X	zperr1("Garbled data subpacket");}X/*X * Read a ZMODEM header to hdr, either binary or hex.X *X *   Set Rxhlen to size of header (default 4) (valid iff good hdr)X *  On success, set Zmodem to 1, set Rxpos and return type of header.X *   Otherwise return negative on error.X *   Return ERROR instantly if ZCRCW sequence, for fast error recovery.X */zgethdr(hdr)char *hdr;{X	register int c, n, cancount;XX	n = Zrwindow + Baudrate;X	Rxframeind = Rxtype = 0;Xstartover:X	cancount = 5;again:X	switch (c = readline(Rxtimeout)) {X	case 021: case 0221:X		goto again;X	case RCDO:X	case TIMEOUT:X		goto fifi;X	case CAN:gotcan:X		if (--cancount <= 0) {X			c = ZCAN; goto fifi;X		}X		switch (c = readline(Rxtimeout)) {X		case TIMEOUT:X			goto again;X		case ZCRCW:X			switch (readline(Rxtimeout)) {X			case TIMEOUT:X				c = ERROR; goto fifi;X			case RCDO:X				goto fifi;X			default:X				goto agn2;X			}X		case RCDO:X			goto fifi;X		default:X			break;X		case CAN:X			if (--cancount <= 0) {X				c = ZCAN; goto fifi;X			}X			goto again;X		}X	/* **** FALL THRU TO **** */X	default:agn2:X		if ( --n == 0) {X			c = GCOUNT;  goto fifi;X		}X		goto startover;X	case ZPAD:		/* This is what we want. */X		break;X	}X	cancount = 5;splat:X	switch (c = noxrd7()) {X	case ZPAD:X		goto splat;X	case RCDO:X	case TIMEOUT:X		goto fifi;X	default:X		goto agn2;X	case ZDLE:		/* This is what we want. */X		break;X	}XXX	Rxhlen = 4;		/* Set default length */X	Rxframeind = c = noxrd7();X	switch (c) {X	case ZVBIN32:X		if ((Rxhlen = c = zdlread()) < 0)X			goto fifi;X		if (c > ZMAXHLEN)X			goto agn2;X		Crc32r = 1;  c = zrbhd32(hdr); break;X	case ZBIN32:X		if (Usevhdrs)X			goto agn2;X		Crc32r = 1;  c = zrbhd32(hdr); break;X	case ZVBINR32:X		if ((Rxhlen = c = zdlread()) < 0)X			goto fifi;X		if (c > ZMAXHLEN)X			goto agn2;X		Crc32r = 2;  c = zrbhd32(hdr); break;X	case ZBINR32:X		if (Usevhdrs)X			goto agn2;X		Crc32r = 2;  c = zrbhd32(hdr); break;X	case RCDO:X	case TIMEOUT:X		goto fifi;X	case ZVBIN:X		if ((Rxhlen = c = zdlread()) < 0)X			goto fifi;X		if (c > ZMAXHLEN)X			goto agn2;X		Crc32r = 0;  c = zrbhdr(hdr); break;X	case ZBIN:X		if (Usevhdrs)X			goto agn2;X		Crc32r = 0;  c = zrbhdr(hdr); break;X	case ZVHEX:X		if ((Rxhlen = c = zgethex()) < 0)X			goto fifi;X		if (c > ZMAXHLEN)X			goto agn2;X		Crc32r = 0;  c = zrhhdr(hdr); break;X	case ZHEX:X		if (Usevhdrs)X			goto agn2;X		Crc32r = 0;  c = zrhhdr(hdr); break;X	case CAN:X		goto gotcan;X	default:X		goto agn2;X	}X	for (n = Rxhlen; ++n < ZMAXHLEN; )	/* Clear unused hdr bytes */X		hdr[n] = 0;X	Rxpos = hdr[ZP3] & 0377;X	Rxpos = (Rxpos<<8) + (hdr[ZP2] & 0377);X	Rxpos = (Rxpos<<8) + (hdr[ZP1] & 0377);X	Rxpos = (Rxpos<<8) + (hdr[ZP0] & 0377);fifi:X	switch (c) {X	case GOTCAN:X		c = ZCAN;X	/* **** FALL THRU TO **** */X	case ZNAK:X	case ZCAN:X	case ERROR:X	case TIMEOUT:X	case RCDO:X	case GCOUNT:X		zperr2("Got %s", frametypes[c+FTOFFSET]);X	/* **** FALL THRU TO **** */#ifndef DSZX	default:X		if (c >= -4 && c <= FRTYPES)X			vfile("zgethdr: %c %d %s %lx", Rxframeind, Rxhlen,X			  frametypes[c+FTOFFSET], Rxpos);X		elseX			vfile("zgethdr: %c %d %lx", Rxframeind, c, Rxpos);#endifX	}X	/* Use variable length headers if we got one */X	if (c >= 0 && c <= FRTYPES && Rxframeind & 040)X		Usevhdrs = 1;X	return c;}X/* Receive a binary style header (type and position) */zrbhdr(hdr)register char *hdr;{X	register int c, n;X	register unsigned short crc;XX	if ((c = zdlread()) & ~0377)X		return c;X	Rxtype = c;X	crc = updcrc(c, 0);XX	for (n=Rxhlen; --n >= 0; ++hdr) {X		if ((c = zdlread()) & ~0377)X			return c;X		crc = updcrc(c, crc);X		*hdr = c;X	}X	if ((c = zdlread()) & ~0377)X		return c;X	crc = updcrc(c, crc);X	if ((c = zdlread()) & ~0377)X		return c;X	crc = updcrc(c, crc);X	if (crc & 0xFFFF) {X		zperr1(badcrc);X		return ERROR;X	}#ifdef ZMODEMX	Protocol = ZMODEM;#endifX	Zmodem = 1;X	return Rxtype;}X/* Receive a binary style header (type and position) with 32 bit FCS */zrbhd32(hdr)register char *hdr;{X	register int c, n;X	register unsigned long crc;XX	if ((c = zdlread()) & ~0377)X		return c;X	Rxtype = c;X	crc = 0xFFFFFFFFL; crc = UPDC32(c, crc);#ifdef DEBUGZX	vfile("zrbhd32 c=%X  crc=%lX", c, crc);#endifXX	for (n=Rxhlen; --n >= 0; ++hdr) {X		if ((c = zdlread()) & ~0377)X			return c;X		crc = UPDC32(c, crc);X		*hdr = c;#ifdef DEBUGZX		vfile("zrbhd32 c=%X  crc=%lX", c, crc);#endifX	}X	for (n=4; --n >= 0;) {X		if ((c = zdlread()) & ~0377)

⌨️ 快捷键说明

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