1. 程式人生 > >2440 Xmodem協議傳送檔案的簡單實現

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;
}