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

📄 test.c

📁 UCOSII FOR freescale 9s12E64
💻 C
📖 第 1 页 / 共 2 页
字号:
           }
           else 
           {
              serial.status = 0x00;
              serial.token  = 0x00;//初始化报文
           }
           break;
      case 0x01 :
           if(ch==0xAA) 
           {
              serial.status = 0x02;
              RX_index=0;
           }
           else 
           {
              serial.status = 0x00; 
              serial.token  = 0x00;//初始化报文
           }
           break;

      case 0x02 :            //接收数据长度 2byte
           RX_temp[RX_index]=ch; 
           RX_index++;
           if(RX_index==2) //接收到第二个数据时,开始进行第1步判断
           {
                serial.len = RX_temp[1]*256+RX_temp[0];	
	            serial.status = 0x03;
	            RX_index=0; 
	            if(serial.len>SIZE_IN_BUFFER) serial.token = 0xF0;
           }
           break;    
           
      case 0x03 ://接收 reserved 数据
			RX_index++;
		   if(RX_index==2) //接收到第二个数据
           {
             serial.status = 0x04;  
             RX_index=0;
           }
           break;
      
      case 0x04 ://接收CRC 2byte
           RX_temp[RX_index]=ch; 
           RX_index++;
           if(RX_index==2) //接收到第二个数据时,开始进行第1步判断
           {
                serial.CRC = RX_temp[1]*256+RX_temp[0];	
	            serial.status = 0x05;
	            RX_index=0;
           }
           break;
			
		  case 0x05 ://接收 L3 层的数据   
		   if(serial.Addr<serial.len) {
		     RXData[serial.Addr++]=ch;
		   } 
		   if(serial.Addr==serial.len){
		    OSSemPost(EventSem1); 	  
		    asm{
		      NOP
		    };
	        }
          break; 	     
      default : break;	              
    }
  }
  OSIntExit();	 
}

word CRC_16(byte *ptr, word len) {
 register word crc=0xFFFF;
 register byte da;
 while(len--!=0) {
 da=(byte) (crc>>8); // 以8 位二进制数的形式暂存CRC 的高8 位
 crc<<=8;              // 左移8 位,相当于CRC 的低8 位乘以28 
 crc^=crc_ta[da^*ptr]; // 高8 位和当前字节相加后再查表求CRC ,再加上以前的CRC 
 ptr++;
}
return(crc);
}

//剔出AA 00 AA 中的00
void demodulation(byte *s,word str_len)
{
  byte flag=0; 
  word k;
  word j; 

  if(str_len<6)   return;

  for(k=0;k<str_len;k++)
  { 
    if(flag!=0) //当已经设置标志位以后
    {
     if(s[k]==0x00){flag=2; continue; }//继续循环
     else if(s[k]==0xAA)  //此时应该进行插入或者删除操作
     {
      if(flag==2)
      {
       for(j=k;j<str_len;j++) {
         s[j-1]=s[j];      //删除时
       }
       k--; 
       str_len--; 
       s[str_len]=0x00;     //把最后一个值赋为0
       }
     }
     else flag=0; // 进行下一次判断
    }
    
    if((s[k])==0xAA)
    {
     flag=1;      //设置标志位
    }
  }
}

//在AA AA 中增加一个00
word modulation(byte *s,word str_len)
{
  byte flag=0; 
  word k;
  word j; 
  for(k=0;k<str_len;k++)
  { 
    if(flag==1) //当已经设置标志位以后
    {
     if(s[k]==0xAA)
     {
       for(j=0;j<str_len-k+1;j++)
         s[str_len+1-j]=s[str_len-j];      //删除时
       s[k]=0x00;
       k++; 
       str_len++;  
     }//继续循环
     else if(s[k]==0x00) flag=1; 
     else flag=0; // 进行下一次判断
    }
    if((s[k])==0xAA)
    {
     flag=1;      //设置标志位
    }
  }
  return str_len;
}

void CommDeal(void) 
{  
   INT8U err;
   word cal_crc,Send_len; 
   word i;   
   Send_len=0;
   //首先填充固定的数据
   Send_toot[0]=0xAA;Send_toot[1]=0xAA; //同步字
   Send_toot[4]=0x00;Send_toot[5]=0x00; //Reserved
    
   //接下来填充其他的字段
   	 OSSemPend(EventSem1,0,&err);
     if(serial.status == 0x05) //如果接收数据到了L3层,需要进一步处理
     {
       serial.cmd=RXData[0];	 //获得命令值
       cal_crc=CRC_16(RXData,serial.len); //计算出CRC
       //下一步为判断两个crc是否相等
       if(cal_crc==serial.CRC) 
       {  
         demodulation(RXData,serial.len);   //把L3层的数据解包  
         switch(serial.cmd) 
         {
            //******M_ddu_HW_REPORT_REQ*************
            case 1 ://**** M_ddu_HW_REPORT_RSP *****
                   Hard_respond();
                   //重新整理数据
                   Send_len=modulation(Send_Buffer,32);
                   //CRC的填充
                   cal_crc=CRC_16(Send_Buffer,Send_len);//计算出CRC
                   Send_toot[7]=(cal_crc>>8) & 0xFF;
                   Send_toot[6]=cal_crc & 0xFF;  //CRC
                   
                   Send_toot[3]=(Send_len>>8)&0xFF;Send_toot[2]=Send_len & 0xFF;//长度
                   break;
            default:
                    //命令的填充
                    Send_Buffer[0]=0x17;          //0-Message ID
                    Send_Buffer[1]=0xFF;		      //1-padding
                    Send_Buffer[2]=RXData[2];		  //2
                    Send_Buffer[3]=RXData[3];		  //3-Sequence Number
                    Send_Buffer[4]=0x01;		      //4-ACK
                    Send_Buffer[5]=0x04;		      //5-NACK Reason  ( bad	  CMD)
                    Send_Buffer[6]=0x00;		      //6-Vendor specific error
                    Send_Buffer[7]=0xFF;		      //7-padding
                    Send_len=modulation(Send_Buffer,8); 
                    //CRC的填充
                    cal_crc=CRC_16(Send_Buffer,Send_len);//计算出CRC
                    Send_toot[7]=(cal_crc>>8) & 0xFF;
                    Send_toot[6]=cal_crc & 0xFF;  //CRC
                    
                    Send_toot[3]=(Send_len>>8)&0xFF;Send_toot[2]=Send_len & 0xFF;//长度
                    Send_toot[7]=(cal_crc>>8) & 0xFF;
                    Send_toot[6]=cal_crc & 0xFF;    //CRC 
                    
                    break;
         }
        
        //开始发送数据 
          TxByte(Send_toot[0]);  //发送报头
          TxByte(Send_toot[1]);  //发送报头
          TxByte(Send_toot[2]);  //发送报头
          TxByte(Send_toot[3]);  //发送报头
          TxByte(Send_toot[4]);  //发送报头
          TxByte(Send_toot[5]);  //发送报头
          TxByte(Send_toot[6]);  //发送报头
          TxByte(Send_toot[7]);  //发送报头
          for(i=0;i<Send_len;i++) TxByte(Send_Buffer[i]);//发送数据        
       }
     }   
     serial.token  = 0x00;   //重新开始接收数据
     serial.status = 0x00;   //状态初始化
     serial.Addr   = 0x00;	 //存储器地址初始化
     serial.CRC     = 0x00;	 //存储器地址初始化
     serial.len     = 0x00;	 //存储器地址初始化
  //   err= OSMutexPost(EventMutex1);
     serial.cmd     = 0x00;	 //存储器地址初始化
}

void Hard_respond(void) 
{
  //命令的填充
  Send_Buffer[0]=0x02;        //0-Message ID
  Send_Buffer[1]=0xFF;		    //1-padding
  Send_Buffer[2]=RXData[2];		//2
  Send_Buffer[3]=RXData[3];		//3-Sequence Number
  Send_Buffer[4]=0x00;//4-Network type
                                                  //0x00----GSM900
                   						          //0x01----GSM1800
                   						          //0x02----GSM1900
                   						          //0x05----GSM800
                   						          //0xFF----No Info
  Send_Buffer[5]=0x60;		      //5-Vendor ID

  Send_Buffer[6]=0x00;      //0x00----HW OK
  Send_Buffer[7]=0xFF;		    //7-padding
  Send_Buffer[8]='E';//8
  Send_Buffer[9]='R';//9
  Send_Buffer[10]='G';//10
  Send_Buffer[11]='A';//11-Device type
  Send_Buffer[12]=1;//12-Minor SW version
  Send_Buffer[13]=1;//13-Major SW version
                                    //version is 1.1
  Send_Buffer[14]=0xFF;		    //14
  Send_Buffer[15]=0xFF;		    //15-padding
  Send_Buffer[16]=2;	//16-Minor SW version
  Send_Buffer[17]=2;	//17-Major SW version
  Send_Buffer[18]=0xFF;		    //18
  Send_Buffer[19]=0xFF;		    //19-padding
  Send_Buffer[20]='L';	//20
  Send_Buffer[21]='1';	//21-Factory Code
  Send_Buffer[22]='0';	//22
  Send_Buffer[23]='6';	//23-Year
  Send_Buffer[24]='4';	//24
  Send_Buffer[25]='1';	//25-Week
  Send_Buffer[26]='1';	//26
  Send_Buffer[27]='2';	//27
  Send_Buffer[28]='3';	//28
  Send_Buffer[29]='4';	//29
  Send_Buffer[30]='5'; //30-Serial number of the week
  Send_Buffer[31]=0;		        //31-End of string character 
}

⌨️ 快捷键说明

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