📄 bc2018.c
字号:
{ switch(ReadType)
{
case 4://读出卡号(4B)以验证写入.
CS256_EN244=0;
for(i=UintAddr;i<(UintAddr+PageOrByteWrite);i++)
{ DOG=~DOG;
Delay(10);/*必须加入此延时*/
RevEepPageBytDatBuf[i-UintAddr+4]=XBYTE[PageAddr+i];
}
CS256_EN244=1;
for(i=0;i<4;i++)
{ DOG=~DOG;
if(RevEepPageBytDatBuf[i]==RevEepPageBytDatBuf[i+4])
{
BReturn=1;
continue;
}
else
{ BReturn=0;
break;
}
}
break;
case 1://读出开门方式字(1B)以验证写入.
CS256_EN244=0;
for(i=UintAddr;i<(UintAddr+PageOrByteWrite);i++)
{ DOG=~DOG;
Delay(10);/*必须加入此延时*/
RevEepPageBytDatBuf[i-UintAddr+1]=XBYTE[PageAddr+i];
}
CS256_EN244=1;
for(i=0;i<1;i++)
{ DOG=~DOG;
if(RevEepPageBytDatBuf[i]==RevEepPageBytDatBuf[i+1])
{
BReturn=1;
continue;
}
else
{ BReturn=0;
break;
}
}
break;
}
}
}
}
return(BReturn);
}
/////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/*****************************指纹模块子程序系列****************************/
/////////////////////////////////////////////////////////////////////////////
/***************************************************************************
功能:对应答包进行解包.
输入参数:Addr-SM-L62模块地址;
Cmd-指令,据指令决定应答包返回的参数类型:
0x02 录指纹图像的应答包(返回的图像尺寸参数,5B);
0x04 精确比对的应答包(返回的比对分数参数,2B);
0x05/0x25 1:n搜索指纹库的应答包(返回的页码及用户信息参数,2B+32B);
0x0F 读系统参数表的应答包(返回的参数表参数,50B);
AckPackDatLenth-除协议头尾后的完整应答包长度,调用时用InputPwCnt_RevDatLenth传给它.
返回值:无
编者:ZSJ
修改:
注意:应答包的实际包长度暂时不能从应答包取包长度记录值,因为包长度可能需要解码.
*******************************************************************************************
bit UnpackRevDat(Uchar Cmd,Uint AckPackDatLenth)
{ register i;
Uchar BackCode;//返回码
BackCode=0;
PtRevOrSendDat=&RevEepPageBytDatBuf;
for(i=0;i<(AckPackDatLenth-2);i++)
{ DOG=~DOG;
if(i==7)
{ BackCode=*(PtRevOrSendDat+i);//順便获取返回码
}
else
{
if((i==8)&&(Cmd==0x05))
{ TimeOneMinuteCnt_PageId=(*(PtRevOrSendDat+i));
TimeOneMinuteCnt_PageId<<=8;
}
if((i==9)&&(Cmd==0x05))
{TimeOneMinuteCnt_PageId+=(*(PtRevOrSendDat+i));}
}
}
if(!BackCode)
{return(0);}
else
{return(1);}
}*/
bit UnpackRevDat(/*Ulong Addr,*/Uchar Cmd,Uint AckPackDatLenth)
{ register i;
bit BNeedUncode;
Uchar TempDat;
Uchar BackCode;//返回码
BackCode=0;
BNeedUncode=0;
PtRevOrSendDat=&RevEepPageBytDatBuf;
for(i=0;i<(AckPackDatLenth-2);i++)
{ DOG=~DOG;
if(i==7)
{ BackCode=*(PtRevOrSendDat+i);//順便获取返回码
}
else
{
if((i==8)&&(Cmd==0x05))
{ TimeOneMinuteCnt_PageId=(*(PtRevOrSendDat+i));
TimeOneMinuteCnt_PageId<<=8;
}
if((Cmd==0x05)&&(i<11)&&(i>8))
{ TempDat=(*(PtRevOrSendDat+i));
switch(i)
{
case 9:
if(TempDat==0xdb)
{BNeedUncode=1;}
else
{TimeOneMinuteCnt_PageId+=TempDat;}
break;
case 10:
if(BNeedUncode)
{
switch(TempDat)
{
case 0xdd:
TimeOneMinuteCnt_PageId+=0xdb;
break;
case 0xdc:
TimeOneMinuteCnt_PageId+=0xc0;
break;
default:
TimeOneMinuteCnt_PageId+=0xdb;
break;
}
BNeedUncode=0;
}
else
{TimeOneMinuteCnt_PageId+=TempDat;}
break;
default:
break;
}
}
}
}
if(!BackCode)
{return(0);}
else
{return(1);}
}
/******************************************************************************************************
功能:判断并编码(先判断是否需要编码,若需要则编码)
输入参数:CodingObj-编码对象 0时,地址部分编码;
1时,包长度(为未经编码的原数据总个数)编码;
2时,参数部分编码,现在只做参数部分编码;
3时,数据包数据编码,暂不考虑.
ParaTyp- 0 无参数需传递;
1 需传递1个缓冲区号(则取Parameter最低字节);
2 需传递2个缓冲区号(则取Parameter最低字);
* 3 需传递1个缓冲区号及页长(起始页码默认为0000)(则取Parameter最低3字节); (可能需编码)
* 4 需传递1个缓冲区号与模板号(则取Parameter最低3字节); (可能需编码)
* 5 需传递模板号(则取Parameter最低字); (可能需编码)
6 需传递配置表(则取Parameter[xx xx xx 00],再发[00 00 00 00]);
7 需传递安全等级(则取Parameter最低字节);
8 需传递握手口令(则取Parameter); (已缺省为0x00000000,暂不考虑编码)
9 需传递闪灯参数(则取Parameter最低字);
输出参数:SendDatBuffer[20]- 因暂只考虑参数部分编码,所以编码数据暂行直接放入命令发送缓冲区.
返回值:1-已编码;0-不需编码.
编者:ZSJ
修改:
*********************************************************************************************************/
void JudgeAndCoding(Uchar CodingObj,Uchar CmdId,Uchar ParaTyp,Ulong ParaValue)
{ register i;
Uchar BytValue;
Uchar GetParaLenth;
Uchar *PtRevOrSendDat;
GetParaLenth=0;
RecordInputCondit_CodingDatCnt=0;
PtRevOrSendDat=&RevEepPageBytDatBuf;
switch(CodingObj)
{
case 2://参数部分编码,现在只做参数部分编码.
switch(ParaTyp)
{
case 3://需传递1个缓冲区号及页长(起始页码默认为0000)(则取Parameter最低3字节);
if(CmdId==0x05)
{ GetParaLenth=2;
RecordInputCondit_CodingDatCnt++;
switch(MarkKeyNum_SendDatLenth)
{
case 11:
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-1)=*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-2);
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-2)=*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-3);
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-3)=(Uchar)((ParaValue&0x00ff0000)>>16);
break;
case 12:
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-1)=*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-2);
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-2)=*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-3);
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-3)=*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-4);
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-4)=(Uchar)((ParaValue&0x00ff0000)>>16);
break;
case 13:
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-1)=*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-2);
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-2)=*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-3);
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-3)=*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-4);
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-4)=*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-5);
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-5)=(Uchar)((ParaValue&0x00ff0000)>>16);
break;
}
for(i=0;i<GetParaLenth;i++)
{ BytValue=(Uchar)((ParaValue&(0x0000ff00>>(8*i)))>>(8-8*i));
if(BytValue==0xC0)
{ RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-1)=0xDB;
RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-1)=0xDC;
}
if(BytValue==0xDB)
{ RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-1)=0xDB;
RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-1)=0xDD;
}
if((BytValue!=0xC0)&&(BytValue!=0xDB))
{ RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-1)=BytValue;
}
}
}
if(CmdId==0x25)
{ RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+MarkKeyNum_SendDatLenth-1)=(Uchar)((ParaValue&0x00ff0000)>>16);
}
break;
case 4://需传递1个缓冲区号与模板号(则取Parameter最低3字节,模板号可能需编码)
GetParaLenth=2;
RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+8)=(Uchar)((ParaValue&0x00ff0000)>>16);
for(i=0;i<GetParaLenth;i++)
{ BytValue=(Uchar)((ParaValue&(0x0000ff00>>(8*i)))>>(8-8*i));
if(BytValue==0xC0)
{ RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+8)=0xDB;
RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+8)=0xDC;
}
if(BytValue==0xDB)
{ RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+8)=0xDB;
RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+8)=0xDD;
}
if((BytValue!=0xC0)&&(BytValue!=0xDB))
{ RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+8)=BytValue;
}
}
break;
case 5://需传递模板号(则取Parameter最低字,可能需编码)
GetParaLenth=2;
for(i=0;i<GetParaLenth;i++)
{ BytValue=(Uchar)((ParaValue&(0x0000ff00>>(8*i)))>>(8-8*i));
if(BytValue==0xC0)
{ RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+8)=0xDB;
RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+8)=0xDC;
}
if(BytValue==0xDB)
{ RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+8)=0xDB;
RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+8)=0xDD;
}
if((BytValue!=0xC0)&&(BytValue!=0xDB))
{ RecordInputCondit_CodingDatCnt++;
*(PtRevOrSendDat+RecordInputCondit_CodingDatCnt+8)=BytValue;
}
}
break;
case 8://需传递握手口令(则取Parameter,已缺省为0x00000000,暂不考虑编码)
break;
}
break;
default://其它部分编码,暂不考虑.
break;
}
}
/*****************************************************************************
功能:对要发送的命令数据进行打包.
输入参数:Addr-SM-L62模块地址;CmdPackParaLenth-命令包参数数据长度;Cmd-指令;
ParaType-需传递的参数类型:
0 无参数需传递;
1 需传递1个缓冲区号(则取Parameter最低字节);
2 需传递2个缓冲区号(则取Parameter最低字);
3 需传递1个缓冲区号及页长(则取Parameter最低3字节);
4 需传递1个缓冲区号与模板号(则取Parameter最低3字节);
5 需传递模板号或起始页码(则取Parameter最低字);
6 需传递配置表(则取Parameter[xx xx xx 00],再发[00 00 00 00]);
7 需传递安全等级(则取Parameter最低字节);
8 需传递握手口令(则取Parameter);
9 需传递闪灯参数(则取Parameter最低字);
ParaStartPage-起始页;
Parameter-需传递的参数(取整个或一部分).
输出参数:MarkKeyNum_SendDatLenth-待发命令及数据长度.
返回值:无
编者:ZSJ
修改:
注意:包长度始终为编码前的原始参数加命令数据总个数及校验和为原始数据的加和
***********************************************************************************************************/
void PackSendDat(Ulong Addr,Uint CmdPackParaLenth,Uchar Cmd,Uchar ParaType,Uint ParaStartPage,Ulong Parameter)
{ register i;
Uint CheckNum;
//Uchar *PtRevOrSendDat;
CheckNum=0;
InputPwCnt_RevDatLenth=0;
MarkKeyNum_SendDatLenth=0;
//EquipmentAddr=Addr;
//PtRevOrSendDat=&SendDatBuffer;
PtRevOrSendDat=&RevEepPageBytDatBuf;
for(i=0;i<(sizeof(RevEepPageBytDatBuf)-1);i++)
{*(PtRevOrSendDat+i)=0x00;}
//放入协议头
*PtRevOrSendDat++=0xC0;
MarkKeyNum_SendDatLenth++;
//放指令包的包标识符
*PtRevOrSendDat++=0x01;
CheckNum+=0x01;
MarkKeyNum_SendDatLenth++;
//放指纹模块设备地址
for(i=0;i<4;i++)
{ CheckNum+=(Uchar)((Addr&(0xff000000>>(8*i)))>>(24-8*i));
*PtRevOrSendDat++=(Uchar)((Addr&(0xff000000>>(8*i)))>>(24-8*i));//地址不为缺省地址0000时可能要进行编码.zsjya暂未做
MarkKeyNum_SendDatLenth++;
}
//放包长(始终为未经编码的原数据总个数)
//PointTempPosi=PtRevOrSendDat; zsj
*PtRevOrSendDat++=(Uchar)((CmdPackParaLenth&0xff00)>>8);
*PtRevOrSendDat++=(Uchar)(CmdPackParaLenth&0x00ff);
CheckNum+=(Uchar)((CmdPackParaLenth&0xff00)>>8);
CheckNum+=(Uchar)(CmdPackParaLenth&0x00ff);
MarkKeyNum_SendDatLenth+=2;
//放指令
*PtRevOrSendDat++=(Uchar)(Cmd&0x00ff);
CheckNum+=(Uchar)(Cmd&0x00ff);
MarkKeyNum_SendDatLenth++;
//放参数
switch(ParaType)
{
case 0://无参数需传递
break;
case 1://需传递1个缓冲区号(则取Parameter最低字节)
case 7://需传递安全等级(则取Parameter最低字节)
*PtRevOrSendDat++=(Uchar)(Parameter&0x000000ff);
CheckNum+=(Uchar)(Parameter&0x000000ff);
MarkKeyNum_SendDatLenth++;
break;
case 2://需传递2个缓冲区号(则取Parameter最低字)
case 9://需传递闪灯参数(则取Parameter最低字)
*PtRevOrSendDat++=(Uchar)((Parameter&0x0000ff00)>>8);
*PtRevOrSendDat++=(Uchar)(Parameter&0x000000ff);
CheckNum+=(Uchar)((Parameter&0x0000ff00)>>8);
CheckNum+=(Uchar)(Parameter&0x000000ff);
MarkKeyNum_SendDatLenth+=2;
break;
case 3://需传递1个缓冲区号及页长(起始页码默认为0000)(则取Parameter最低3字节);
for(i=0;i<2;i++)
{CheckNum+=(Uchar)((ParaStartPage&(0x0000ff00>>(8*i)))>>(8-8*i));}
JudgeAndCoding(2,Cmd,5,ParaStartPage);
PtRevOrSendDat+=RecordInputCondit_CodingDatCnt;
MarkKeyNum_SendDatLenth+=RecordInputCondit_CodingDatCnt;
CmdPackParaLenth+=RecordInputCondit_CodingDatCnt;
RecordInputCondit_CodingDatCnt=0;
for(i=0;i<3;i++)
{CheckNum+=(Uchar)((Parameter&(0x00ff0000>>(8*i)))>>(16-8*i));}
JudgeAndCoding(2,Cmd,ParaType,Parameter);
PtRevOrSendDat+=RecordInputCondit_CodingDatCnt;
MarkKeyNum_SendDatLenth+=RecordInputCondit_CodingDatCnt;
CmdPackParaLenth+=RecordInputCondit_CodingDatCnt;
RecordInputCondit_CodingDatCnt=0;
break;
case 4://需传递1个缓冲区号与模板号(则取Parameter最低3字节,模板号可能需编码)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -