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

📄 rfid.c

📁 c8051f310xmodembootloader.rar
💻 C
字号:
#include "global.h"

/******************************************************************************
** 函数: Process_Frame()
** 入参: rxdata
** 返回: 
** 说明:
******************************************************************************/
void Process_Frame()
{
  UCHAR i,j,nr;
  UINT idata result;
  ULONG idata sum;
  REPLY_FRAME xdata *reply;
 
  
  reply=(REPLY_FRAME xdata *)(rxdata+1);	//指针偏移 第一位是起始0xfa   
  sum = (ULONG)cksum(rxdata+1,16);			//求累加和
  result = (UINT)(sum + (sum >> 16));		//实际校验值
  
  memcpy(wiebuf, rxdata+7, 6);			    //复制卡号用于wiegand发送
  memcpy(TagID,wiebuf,6);                   //复制标签卡号用于回命令




  if((rxdata[2]==PCS_read_TAG)||(rxdata[2]==PCS_wt_OK)) 
  {
   MSG_LEDG;			                //LEDG无等待时间闪烁 
   tag_r_reader();
  }


  if(reply->crc==result)				//查看接收的数据校验是否过
  {
		if(((reply->cmd)&0xf0)==0x00)
		{
		 return;                        //高半字节0的 基站不响应 **
		}
        MSG_LEDG;			            //LEDG无等待闪


	    if((TRIG==0)&&(TRIG_STATE==1))
	    {
	        TRIG_STATE=0;               //清标记  
	    }
		else
		{
		    flg_io=reply->tag_flag;		//不在触发时 使用卡的进出
		}

	    for(i=0;i<10;i++)	            //查看是否是已进入的标签
        {

		    if(((memcmp(reply->tag_id,tagnr[i].save_id,6)==0))&&(tagnr[i].save_state!=0))

	        {
		          nr=i;
		          tagnr[nr].save_state =FLG_OLD;			   
		          break;
	        }
        }

        if(i==10)
  	    {
	       for(j=0;j<10;j++)  //新进入的标签?登记!
		   {
		       if(tagnr[j].save_state==0)		     
		       {
		          nr=j;
			      tagnr[nr].save_state =FLG_NEW;
			      break;
		       }
		   }
	    }

	    if(nr>10)		       //防止nr出错	,这里可以考虑老化掉登记了最久的卡
	    {
	       return;
	    }

        switch(tagnr[nr].save_state)
	    {
               case FLG_NEW:
					 if(1)
					// if(((TRIG==0)&&(TRIG_STATE==1))||(TRIG==1))	  
	                 {							//触发状态加触发或者非触发才询卡
			  			    					
			              SeekFrame(WCMD_SLP);  //普通寻卡
                          txregframe(FRAME_LEN);

	                 }

                     else 
	                 { 
		                  return;               //被触发下 没触发不理会收到的数据
		             }	  


		            for(i=0;i<6;i++)
		            {
		                tagnr[nr].save_id[i] =reply->tag_id[i];       //复制卡号
		            }
	    
		                tagnr[nr].save_io         =reply->tag_flag;   //进出标记
		                tagnr[nr].save_state      =FLG_OLD;
		                tagnr[nr].save_inactivity =INACTIVITY_TIME;   //登记就开启溢出
						
	                    wiegandout(wiefmt,flg_io);                    //全新卡需要输出wiegand
		  			/*
		            for(i=0;i<6;i++)
		            {
		                if(DEBUG) Printf_Char(reply->tag_id[i]);
		            }
				    */ 
                    relay_work();
		            event_relay=RELAY_TIME_IN;
		            break; 

	           case FLG_OLD:

		            for(i=0;i<6;i++)								//旧卡只登记并赋值重计算老化时间
		            {
		                tagnr[nr].save_id[i] =reply->tag_id[i];    //复制卡号
		            }
	    
		                tagnr[nr].save_io         =reply->tag_flag;   //进出标记
		                tagnr[nr].save_state      =FLG_OLD;
		              //tagnr[nr].save_inactivity =INACTIVITY_TIME; //登记就开启溢出
		              //离开卡后再次输出wie 与每ns输出区别


		       if(INACTIVITY_TIME==0)  //连续输出
		       {

				
			       wiegandout(wiefmt,flg_io);   //全新卡需要输出wieand

		       }
		          break; 		           // 老化更新后再次读到时作新卡输出

	           default:
		       break;
	    }
 }	
  
  else
  {
   // if(DEBUG) Printf_String("\r\n[msg:]crc error"); 
  }	 

}
/******************************************************************************
** 函数: SeekFrame()
** 入参: txdata
** 返回: 
** 说明:
******************************************************************************/
void SeekFrame(UCHAR cmdd)
{
 
  ULONG idata sum;
  UINT  result;

  FIND_TAG xdata *seek;



  seek = (FIND_TAG xdata *)(txdata + 4);  //指针偏移 
  memcpy(txdata, SiHead, 4); 
  seek->data_len=sizeof(FIND_TAG)-1;	  //数据长度
  seek->cmd=cmdd;                         //命令  01=普通讯卡 02=加卡
  memcpy(seek->reader_id, MyID, 4); 	  //基站系统号

  
     switch(cmdd)
  	 {
	    case 0x01:						      //广播
	         memset(seek->tag_id, 0xff, 6);
		     break;	 

	    case 0x02:						      //休眠点卡
	         memcpy(seek->tag_id, TagID, 6);	
		     break;


	    default:							  //出错广播
	         memset(seek->tag_id, 0xff, 6);
	         break;   

	 }

  seek->tag_flag=0x55;                        //询问时填充卡的进出标记任意数据
  seek->skey[0]=0xff;					      //处理密钥
  seek->skey[1]=0xff;
  seek->skey[2]=0xff;
  seek->skey[3]=0xff;
  sum = (ULONG)cksum(txdata+4,sizeof(FIND_TAG)-2-1);	  //从长度开始算SUM

  result = (UINT)(sum + (sum >> 16));
  seek->crc=result;						                  //处理校验
}






⌨️ 快捷键说明

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