⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usart.c

📁 卫星接受机控制卫星和LCD显示
💻 C
📖 第 1 页 / 共 2 页
字号:
      break;
    case 0x08://software version
      for(i=0;i<2;i++)
      {
         tmp_buf[plen++]=v_soft_ver[i].active_image;
         tmp_buf[plen++]=v_soft_ver[i].version/100+0x30;
         tmp_buf[plen++]=(v_soft_ver[i].version%100)/10+0x30;
         tmp_buf[plen++]=v_soft_ver[i].version%10+0x30;
         tmp_buf[plen++]=v_soft_ver[i].flag;
         tmp_buf[plen++]=v_soft_ver[i].day/10+0x30;
         tmp_buf[plen++]=v_soft_ver[i].day%10+0x30;
         tmp_buf[plen++]=v_soft_ver[i].month/10+0x30;
         tmp_buf[plen++]=v_soft_ver[i].month%10+0x30;
         tmp_buf[plen++]=(v_soft_ver[i].year%100)/10+0x30;
         tmp_buf[plen++]=v_soft_ver[i].year%10+0x30;
      }
      break;
    case 0x09://flash access--------adding on 07-0924 在flashacc_pro处理了
      return;
      
    case 0x20://alive message
      tmp_buf[plen++]=v_counter;
      break;
    /*case 0x21://RxPower
      break;
    case 0x22://TxPower
      break;
    */
   case 0x24://RpsControl  
      tmp_buf[plen++]=v_rpscontrol;
      break;
    case 0x25://RpsAlarm
      tmp_buf[plen++]=v_rpsalarm;
      break;
    case 0x26://ODU control
      tmp_buf[plen++]=v_tmatpc;
      break;
    default:
      break;
    }
  }
  else if(type==0x02){//request message
  }
  else if(type==0x03){//CMD message
  }
  else if(type==0xff){//ACK
  }
  
  load_msg(tmp_buf,plen);   //数据链路层打包,并写入待发送存储区,
}


/*将有效帧根据协议进行命令处理*/
unsigned int msg_handle(unsigned char msg[],unsigned int len)  //命令应答处理
{
   unsigned char type,id,ack;
  /*when received a correct msg,send an ack frame first*/
  send_ack();             
  /*分析包的内容,并作相应处理*/
  
  type=msg[0];
  id=msg[1];
  ack=0;
 /* 
  if(type==0x01){//response message
    ack=msg[2];
  }
  else*/
  if(type==0x02){//request message
      type=0x01;
      if(id==0x09)
         ack=flashacc_pro(msg,len);  //handle the flash access message;
      else
         msg_pack(type,id,ack,msg[2]);
  }
  else if(type==0x03){//command message
    type=0x01;//response
    switch(id){
    case 0x01://alarm
      v_alarm_sim[0]=msg[2];
      v_alarm_sim[1]=msg[3];
      v_alarmsim_counter=30;    /*to stand for 30 seconds*/
      msg_pack(type,id,ack,0);
      break;
    case 0x02://configuration
      ack=config_pro(msg,len);  //handle configuration message
      msg_pack(type,id,ack,msg[2]);
      break;
    case 0x03://filetransfer
      ack=ftrans_pro(msg,len);  //handle file transfer message
      msg_pack(type,id,ack,0);
      break;
    /*case 0x05://measurement
      break;*/
    case 0x07://reset
      if((msg[2]==0x00)||(msg[2]==0x01))
        v_reset=msg[2];
      else ack=ACK_VALINVALID;
      msg_pack(type,id,ack,0);
      //***********reseting*******************/
      reset_pro(v_reset);
      break;
    case 0x08://software version
      ack=swversion_pro(msg,len);//activate the software version selected by the activeImage
      break;
    case 0x09://flash access--------adding on 07-0924
      ack=flashacc_pro(msg,len);  //handle the flash access message;
      break;
    /*case 0x20://alive message
      break;
    case 0x21://RxPower
      break;
    case 0x22://TxPower
      break;*/
    case 0x24://RpsControl
      if((msg[2]==0x00)||(msg[2]==0x01))
        v_rpscontrol=msg[2];
      else ack=ACK_VALINVALID;
      msg_pack(type,id,ack,0);
      break;
    /*case 0x25://RpsAlarm
      break;*/
    case 0x26://ODU control
      if(msg[2]<0x15)
         v_tmatpc=msg[2]*5;  //the unit is ms
      else ack=ACK_VALINVALID;
      msg_pack(type,id,ack,0);
      break;
    default:
      break;
    }
  }
  else if(type==0xff){//ACK
  }
  
  /**/
  return ack;
}

/*从PDA提取信息帧*/
void recv_msg()
{ 
  unsigned char ch;
  
  //read_char_USART0(); /*for debuging^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^for debug*/

  unsigned int recv_point;//接受数据DMA指针
  
  recv_point=MAX_RECV_BUF-u_pUSART0->US_RCR;
  if(u_pUSART0->US_RNCR==0) {
    u_pUSART0->US_RNCR=MAX_RECV_BUF;
    u_pUSART0->US_RNPR =(unsigned int)recv_dma;;
  }
  
  if(recv_point==rx_rd_pt) return;
  else 
  { while (recv_point!=rx_rd_pt){
    
      //if((MAX_RECV_BUF-recv_point)>rx_rd_pt)
      ch=recv_dma[rx_rd_pt++];
      if(rx_rd_pt==MAX_RECV_BUF)  rx_rd_pt=0;
      
    if(ch==0x7e) 
    {
      if(hd_flag==0) 
      { rx_index=0;
        rx_len=0;
        hd_flag++;
        rx_buf[rx_index++]=ch;
      }
      else if(hd_flag==1)
     {
        hd_flag++;
        rx_buf[rx_index++]=ch;
        rx_len=rx_index;
        if(rx_len>4) {unpack();return;}//收到有效帧,解帧
        else { hd_flag=1;            //若收到非法帧,则将刚收到的0x7e作为起始字符。
          rx_len=0;
          rx_buf[0]=0x7e;
          rx_index=1;
        }
     }
     else 
       hd_flag=0;
    }
    else if(hd_flag==1)
    {
       rx_buf[rx_index++]=ch;
    }
  }
  }
}

/*将从PDA中取到的信息帧去掉头、尾,将0x7e、0x7d还原,并进行CRC校验*/
void unpack()  //解包程序
{
   //unsigned char *ch;
   unsigned char msg[256];
   unsigned int i,j,crc_cksum;
   j=0;
   
   //while(rx_buf[i]!=0x7e)
   for(i=0;i<rx_len-2-j;i++)
   { 
      msg[i]=rx_buf[i+j+1];
      if(msg[i]==0x7d)
      {
        j++;
        msg[i]=rx_buf[i+j+1]^0x20;
        
      }
      
      //if(i>255) break;
   }
   crc_cksum=msg[i-2]+(msg[i-1]<<8);
   if(crc_cksum==crc_fun(msg,i-2))
   { msg_handle(msg,i-2);
     hd_flag=0;  //重新开始接收消息
   }
   else{
        hd_flag=1;  ////若收到非法帧,则将刚收到的0x7e作为起始字符。
        rx_len=0;
        rx_buf[0]=0x7e;
        rx_index=1;
   }
}

/*将应用层信息计算校验和,对0x7e、0x7d进行转义处理,产生需要传输的帧*/
unsigned int load_msg(unsigned char *msg,unsigned int len)  //data link layer
{
   unsigned int snum,j;
   unsigned int checksum;
   unsigned char datalink_buf[128];
   checksum=crc_fun(msg,len);
   datalink_buf[0]=0x7e;
   j=0;
   msg[len++]=checksum&0x00ff;
   msg[len++]=(checksum&0xff00)>>8;

   for(snum=0;snum<len;snum++)
   { 
     datalink_buf[snum+j+1]=msg[snum];
     if(msg[snum]==0x7e)
     {
       datalink_buf[snum+j+1]=0x7d;
       j++;
       datalink_buf[snum+j+1]=0x5e;
     }
     else if(msg[snum]==0x7d)
     {
       datalink_buf[snum+j+1]=0x7d;
       j++;
       datalink_buf[snum+j+1]=0x5d;
     }
   }
   snum=snum+j+1;              
   datalink_buf[snum++]=0x7e;
   //write_frame_USART0(datalink_buf,snum);
   
   /*将发送信息帧写入PDA*/
   for(j=0;j<snum;j++)
  {
    send_dma[tx_wr_pt++]=datalink_buf[j];
    if(tx_wr_pt>=MAX_SEND_BUF) tx_wr_pt=0;
    
    /*for debug*/
    printf("%x ",datalink_buf[j]);
  }
  printf("\n");
   return (snum);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -