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

📄 xmodem.c

📁 在阳初s3c2410开发板上实现的xmodem传输协议
💻 C
字号:
#include "xmodem.h"

int pkt_recv(PACKET* pkt)
{
	int i;
	char c, cks = 0;
	
	pkt->pktnbr = sio_getchar();
	pkt->pktnnbr = sio_getchar();
	if (pkt->pktnnbr != 255 - (pkt->pktnbr & 0xff))
		return -1;

	for (i = 0; i < BLOCK_SIZE; i++) {
		pkt->buff[i] = sio_getchar();
		cks += pkt->buff[i];
	}

	pkt->cks = sio_getchar();
	
	if ((cks & 0xff) != pkt->cks)
		return -2;

	return 0;
}

void pkt_save(char* dest, PACKET* pkt)
{
	int i;
	for (i = 0; i < BLOCK_SIZE; i++)
		*dest++ = pkt->buff[i];
}

int xmodem_recv(char* dest)
{
	PACKET pkt;
	int len = 0;

	do {
		delay(ONE_SEC);
		sio_putchar(NAK);
	} while (isempty());

	do {
		switch (sio_getchar()) {
			case SOH:
				if (pkt_recv(&pkt) == 0) {
					pkt_save(dest, &pkt);
					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 + -