打印

ARM2440与PC超级终端通过Xmodem协议通信

[复制链接]
3738|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jimmyzjz|  楼主 | 2008-11-14 15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

遵循xmodem协议给PC发数据,超级终端接收时,每次都要重试2次才能收到数据,不知道该测试代码哪里有问题,望指教!谢谢!


/***************************************************************
*
*                                 xmodem 发送函数
*
1.程序开始时,会循环等待NAK的到来,只要收到的不是NAK,
就会一直等待下去,直到收到了NAK,才开始数据的发送;
2.上一轮如果发送的是一组数据,则收到CAN,程序就中止;
收到ACK,就发送下一组数据;收到NAK,就发送上一组数据;
如果收到的不是上面三种,程序就返回,直到出现三个中的某一个;
3.上一轮如果发送的是EOT,收到CAN就中止;收到ACK,就结束程序;
收到NAK,就再发送EOT;收到的是其他数据就返回,直到出现三个中的某一个。
***************************************************************/

#define filesize  512

U8 Filesend[filesize]={1,2,1,2,1,2,5,2,5,4,5,8,5,5,2,4,5}; //要发送的数据
U8 Datasend[132]; //数据包结构。分别为SOH、包序号、序号补码、5字节数据、校验码

U8 seq =1 ; //数据包序号
U8 seqrev ; //数据包的反码
U8 sum = 0; //累加效验码
U8 flag_pc;  //接收标志
U8 k = 0;                        //指向FileSend的标号,从中取数据时使用,初值为0
U8 j = 0;                         //指向DataSend的标号,发送数据时使用,初值为0
U8 fin_flag = 0;              //数据取完的标志,为1时表示FileSend中的数据已经取完               
U8 eot_flag = 0;             //发送完成的标志,为1时表示430已经发送过了EOT标志

void dely1(U32 tt)
{
   U32 i;
   for(;tt>0;tt--)
   {
     for(i=0;i<1000000;i++){}
   }
}


void Xmodemsend()
{
   flag_pc = Uart_get();
   
   puts("*********Xmodemsend******************** ");

   if(flag_pc == CAN)
       {    
       rGPFDAT =  rGPFDAT & 0xffffffdf;  /*led 2*/
       rGPFDAT =  rGPFDAT | 0x000000d0;
       dely1(10);       
         puts("传输结束 ");
      return;
       }
   
   if(k == 0) /*判断是否是第一次接收*/
    {
      if(NAK == flag_pc)  /*收到NAK则开始发送第一组数据,收到的不是NAK则返回继续等待NAK*/
      {        
        seqrev = 0xff - seq; /*取反码*/
          for(; k<128; k++)
             sum += Filesend[k] ;  /*计算累加和*/
/*取数据包*/
          Datasend[0] = SOH ;
          Datasend[1] = seq ;
          Datasend[2] = seqrev;          
          for(k=0; k<128; k++)
          Datasend[3+k] = Filesend[k];
          Datasend[131] = sum;

/*发数据包*/          
          while(j<132)
              {
              Uart_send(Datasend[j]);
            j++;
              }
        //  k = k + 128;  /*指向下一组数据*/
          seq++;  /*数据包序号加1*/
          j=0;
          sum=0;
          return;/*返回,下面语句不执行*/
          }
       }

   if(k !=0)   /*k!=0,表示已经发送过了数据包,接收到的是PC对数据包的确认命令*/
       {        
      if(NAK == flag_pc)  /* PC发回NAK,则把刚才发送的数据包重新发送一遍*/
          {
         if(eot_flag == 1)  /*如果刚才发送的不是数据,而是EOT,则再将EOT重新发*/
             {
              Uart_send(EOT);
             eot_flag=1;
             return;
             }
/*重新发数据包*/          
          while(j<132)
              {
              Uart_send(Datasend[j]);
            j++;
              } 
            j =0;
        }
       if(ACK == flag_pc)
           {
          if(eot_flag==1)  /*表明刚才发送的是EOT,此时PC发回的ACK是对刚才发送的EOT的确认,程序完*/
              {puts("END ");
                return;
              }
          else if(fin_flag == 1)/*表明刚才发送的是最后一个数据包
                                                        //此时PC发回的ACK是对刚才发送的最后一个数据包的确认
                                                        //数据发送完成,发送EOT,返回等待确认*/
              {Uart_send(EOT);
             eot_flag =1 ;
              }
          else   /*发下一包数据*/
              {
              seqrev = 0xFF - seq ;
              
              for(; k<k+128; k++)
                sum+=Filesend[k];
                k=k-128;
/*取数据包*/
             Datasend[0] = SOH ;
             Datasend[1] = seq ;
             Datasend[2] = seqrev;          
             for(; k<k+128; k++)
             Datasend[3+k] = Filesend[k];
             Datasend[131] = sum;    
/*发数据包*/          
            while(j<132)
                {
                    Uart_send(Datasend[j]);
                    j++;
                 }
              seq++;
              j=0;
              sum=0;
            if(k==512){
                fin_flag =1;
                puts("发送完成 ");              
                }
                
              
              
          }
         }
           
      
    }

  
}


相关帖子

沙发
jimmyzjz|  楼主 | 2008-11-15 11:23 | 只看该作者

顶顶!大家帮忙看看啊。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

0

粉丝