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

📄 xmodem.c

📁 在阳初s3c2410上实现的uudecode协议
💻 C
字号:
#include "xmodem.h"

static
char checksum(FRAME* frame)
{
	int i;
	char datasum = 0x00;
	
	for(i = 0; i < BLOCK_SIZE; ++i)
	{
		datasum += frame->buff[i];
	}
	
  return (datasum & 0xff);
}

static
int blk_recv(FRAME* frame)
{
	int i;
	char c, cks = 0;
	
	frame->blknbr = sio_getchar();
	frame->blkrevnbr = sio_getchar();
	
	if (frame->blkrevnbr != 255 - (frame->blknbr & 0xff))
		return -1;
	else
		for (i = 0; i < BLOCK_SIZE; i++) {
			frame->buff[i] = sio_getchar();
		}

	frame->cks = sio_getchar();
	
    if(frame->cks == checksum(frame))
		return 0;
	else
		return -2;
	
	return 0;
}

int xmodem_recv(char* dest)
{
	FRAME frame;
	int len = 0;

	do {
		delay(ONE_SEC<<1);
		sio_putchar(NAK);
	} while (sio_empty());

	do {
		switch (sio_getchar()) {
			case SOH:
				if (blk_recv(&frame) == 0) {
					str_ncpy(dest, frame.buff, BLOCK_SIZE);
					dest += BLOCK_SIZE;
					len += BLOCK_SIZE;
					sio_putchar(ACK);
					break;
				} else {
					sio_putchar(NAK);
					break;
				}

			case EOT:
				sio_putchar(ACK);
				return len; // success to receive
	
			case CAN:
				sio_putchar(ACK);
				return -1; // cancel by remote
				
			default:
				break;
		}
	} while (1);
}

⌨️ 快捷键说明

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