?? xmodem.c
字號(hào):
#include "xmodem.h"
/* 讀取單個(gè)數(shù)據(jù)包 */
/* 返回0表示讀取數(shù)據(jù)包成功 */
/* 返回1表示數(shù)據(jù)包不完整 */
/* 返回2表示數(shù)據(jù)包檢驗(yàn)和出錯(cuò) */
static
int RecFrame(struct Frame* oneFrame)
{
int returnVal; /* 返回的值 */
int i;
oneFrame->blkNum = sio_getc();
oneFrame->blkNumRev = sio_getc();
/* 檢驗(yàn)數(shù)據(jù)包完整性 */
if( oneFrame->blkNumRev + oneFrame->blkNum!=0xFF)
returnVal = 1;
else
{
/* 讀取數(shù)據(jù)區(qū) */
for(i = 0; i < BLOCK_SIZE; ++i)
{
oneFrame->dataBlk[i] = sio_getc();
}
/* 檢驗(yàn)累加校驗(yàn)和 */
oneFrame->checkSum = sio_getc();
if(oneFrame->checkSum == CheckSum(oneFrame))
returnVal = 0;
else
returnVal = 2;
}
return (returnVal);
}
/* Xmodem協(xié)議傳輸執(zhí)行函數(shù) */
void XmodemRun(char *ptr)
{
struct Frame dataFrame;
sio_init( );
do
{
taskDelay(60);
if (!sio_ischar())
sio_putc(NAK);
} while(!sio_ischar());
do
{
switch(sio_getc())
{
/* 控制字符為SOH,則接收該數(shù)據(jù)包 */
case SOH:
switch( RecFrame(&dataFrame) )
{
/* 數(shù)據(jù)包接收正常,發(fā)送ACK消息,將數(shù)據(jù)區(qū)的數(shù)據(jù)拷貝到內(nèi)存 */
case 0:
MemCpy(ptr, dataFrame.dataBlk, BLOCK_SIZE);
ptr += BLOCK_SIZE;
sio_putc(ACK);
break;
/* 數(shù)據(jù)包接收錯(cuò)誤,發(fā)送NAK消息 */
case 1: case 2:
sio_putc(NAK);
break;
}
break;
case EOT:
sio_putc(ACK);
*(++ptr) = 0; /* 給存儲(chǔ)區(qū)域的最后一個(gè)字節(jié)賦值0,終止sio_puts() */
return;
case CAN:
return;
default:
break;
}
} while(1);
}
/* 延時(shí)函數(shù) */
static
void DelayTime(int time)
{
int i;
for(i = 0; i < time; ++i)
;
}
/* 將數(shù)據(jù)區(qū)的數(shù)據(jù)拷貝到內(nèi)存中 */
static
void MemCpy(char des[], char src[], int length)
{
int i;
for(i = 0; i < length; ++i)
{
des[i] = src[i];
}
}
/* 計(jì)算校驗(yàn)和,返回校驗(yàn)和!!!!!! */
static
unsigned char CheckSum(struct Frame *oneFrame)
{
int i;
unsigned char dataSum = 0x00;
for(i = 0; i < BLOCK_SIZE; ++i)
{
dataSum += oneFrame->dataBlk[i];
}
return (dataSum & 0xff);
}
void getfile()
{
char text[3000];
int i;
XmodemRun(text);
for (i = strlen(text)-2; i> 0; i--)
if (text[i] == 26)
text[i] = 0;
printf("%s\n",text);
return;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -