📄 xmodem.c.svn-base
字号:
#include "config.h"#define XMODEM_SOH 0x01#define XMODEM_EOT 0x04#define XMODEM_ACK 0x06#define XMODEM_NAK 0x15#define XMODEM_CAN 0x18#define XMODEM_DATA_SIZE 128struct frame{ char blknum; char blknumcompl; char data[XMODEM_DATA_SIZE]; char cksum;};static charcksum(struct frame *f){ int i; int sum = 0; for(i = 0; i < XMODEM_DATA_SIZE; i++) { sum += f->data[i]; } return (sum & 0xff); }static void get_frame(struct frame *rframe){ int i; rframe->blknum = sio_getc(); rframe->blknumcompl = sio_getc(); for(i=0; i < XMODEM_DATA_SIZE; i++) { rframe->data[i] = sio_getc(); } rframe->cksum = sio_getc();} intxmodem(char *p){ struct frame aframe; int i, len = 0; do { int loop = 900000; /*XXX*/ sio_putc(XMODEM_NAK); while(--loop && (!sio_ischar())) ; if(loop) break; } while(1); while(1) { switch(sio_getc()) { case XMODEM_SOH: get_frame(&aframe); if((aframe.blknumcompl == 255 - aframe.blknum) && (cksum(&aframe) == aframe.cksum)) { len += XMODEM_DATA_SIZE; for(i = 0; i < XMODEM_DATA_SIZE; i++) *p++ = aframe.data[i]; sio_putc(XMODEM_ACK); } else { sio_putc(XMODEM_NAK); } break; case XMODEM_EOT: sio_putc(XMODEM_ACK); return len; case XMODEM_CAN: return -1; } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -