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