📄 rfid.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 + -