📄 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 + -