2440 Xmodem協議傳送檔案的簡單實現
1Xmodem的簡單實現,暫不包含資料校驗
當準備傳送是先由接收方給傳送方傳送一個NAK資訊;之後傳送方開始傳送包,接收方接收到一個包(132位元組)後給傳送 ACK給傳送方;當傳送方發完時(到檔案的尾了),在傳送一個包,其中包頭SHO(包的第一個位元組)中為EOT,之後接收方再回一個ACk,至此傳輸結束;
xmodem的資料幀結構
_______________________________________________________________
| | | | | |
| SOH | 資訊包序號 | 資訊包序號的補碼 | 資料區段 | 校驗和 |
|_____|____________|___________________|__________|____________|
其中1位元組的SOH,1位元組的包序號,1位元組的序號補碼,128位元組的資料,1位元組的校驗碼,總共132位元組;
2.Xmodem協議相關控制字元
SOH 0x01
STX 0x02
EOT 0x04
ACK 0x06
NAK 0x15
CAN 0x18
CTRLZ 0x1A
int my_loadb(int argc, char *argv[])
{
char *k = (char *)0x37100000; //接收的資料放到以該地址為起始地址的區域
int size;
char z;
int i;
//uart_putchar(NAK);
delay(); //延時大概十秒鐘,給開啟xmodem傳送的視窗留出時間
uart_putchar(NAK); // 傳送NAK (確保此時Xmodem傳送視窗已經開啟,等待著NAK)
size = judge_hex(argv[1]);
while(1)
{
z = uart_getchar(); //接收SHO(第一位元組)判斷是否為 EOT
if(EOT == z)
break;
for(i = 1; i < 3; i++) //接收兩位元組的序號
{
z = uart_getchar();
//uart_putchar(*(k-1));
}
for(i = 3; i < 131; i++) //接收128位元組的資料
{
*k++ = uart_getchar();
//uart_putchar(*(k-1));
}
z = uart_getchar(); //接收一位元組的校驗碼,在次並沒有處理;
uart_putchar(ACK); //接收玩一個包,傳送ACK
}
uart_putchar(ACK); //收到EOT ,再發送一個ACK
my_puts("download ok");
my_puts("\n");
my_puts("the start address is :");
my_putx(0x37100000);
my_puts("\n");
return 0;
}