2440 Xmodem协议传送文件的简单实现

来源:互联网 发布:男生衣服搭配软件 编辑:程序博客网 时间:2024/06/05 23:46

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

0 0
原创粉丝点击