📄 bc2018.c
字号:
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 5://需传递模板号(则取Parameter最低字,可能需编码)
for(i=0;i<2;i++)
{CheckNum+=(Uchar)((Parameter&(0x0000ff00>>(8*i)))>>(8-8*i));}
JudgeAndCoding(2,Cmd,ParaType,Parameter);
PtRevOrSendDat+=RecordInputCondit_CodingDatCnt;
MarkKeyNum_SendDatLenth+=RecordInputCondit_CodingDatCnt;
CmdPackParaLenth+=RecordInputCondit_CodingDatCnt;
RecordInputCondit_CodingDatCnt=0;
break;
case 6://需传递配置表(则取Parameter[xx xx xx 00],再发[00 00 00 00])
for(i=0;i<4;i++)
{ CheckNum+=(Uchar)((Parameter&(0xff000000>>(8*i)))>>(24-8*i));
*PtRevOrSendDat++=(Uchar)((Parameter&(0xff000000>>(8*i)))>>(24-8*i));
MarkKeyNum_SendDatLenth++;
}
for(i=0;i<4;i++)
{ *PtRevOrSendDat++=0x00;
MarkKeyNum_SendDatLenth++;
}
break;
case 8://需传递握手口令(则取Parameter)
for(i=0;i<4;i++)
{ CheckNum+=(Uchar)((Parameter&(0xff000000>>(8*i)))>>(24-8*i));
*PtRevOrSendDat++=(Uchar)((Parameter&(0xff000000>>(8*i)))>>(24-8*i));
MarkKeyNum_SendDatLenth++;
}
break;
}
//放校验和
*PtRevOrSendDat++=(Uchar)((CheckNum&0xff00)>>8);
*PtRevOrSendDat++=(Uchar)(CheckNum&0x00ff);
MarkKeyNum_SendDatLenth+=2;
//放结束符
*PtRevOrSendDat++=0xC0;
MarkKeyNum_SendDatLenth++;
PtRevOrSendDat=&RevEepPageBytDatBuf;//ZSJYA
//EA=1;ES=1; //JJ
}
/*****************************************************************************
功能:起动串口发送.
输入参数:无
输出参数:PtSendDat -指向发送缓冲区.
MarkKeyNum_SendDatLenth-待发送的数据长度.
返回值: 无
编者:ZSJ
修改:
注意:应答包的实际包长度暂时不能从应答包取包长度记录值,因为包长度可能需要解码.
********************************************************************************/
void StartSeriSendDat()
{ SBUF=*PtRevOrSendDat++;
MarkKeyNum_SendDatLenth--;
}
/***********单一功能函数*************/
#if NOUSE==1
/********************************************************************
简介:复位(指令0x15).
功能:模块软复位,进行系统初始化。复位后重新验证设备握手口令(当口令不为0000时).
输入参数:无
输出参数:无
返回值:(1B,如下列出情况)
MX_OK(0x00) 复位成功;
MX_COMM_ERR(0x01) 通讯错误;
MX_RESET_ERR(0x14) 复位失败。
编者:ZSJ
修改:
*********************************************************************/
bit CmdReset()
{ ES=1;
Delay_163us();
PackSendDat(0,1,0x15,0,0,0);
TimeDoorOpenCnt=0;
BPreventStop=1;
StartSeriSendDat();//发协议头0xC0,启动串口发送;然后在串口中断中将缓冲区中的所有数据发送出去.
//BDatRevOk=0;
LableBitVar&=0xfe;
//while(!BDatRevOk); //等待串口应答包完成
while((LableBitVar&0x01)==0x00)
{ DOG=~DOG;
if(TimeDoorOpenCnt>100)
{break;}
}
BPreventStop=0;
TimeDoorOpenCnt=0;
ES=0;
return(UnpackRevDat(/*0,*/0x15,InputPwCnt_RevDatLenth));//解开应答包,并返回应答码及应答结果.
}
#endif
/********************************************************************
简介:探测手指(指令0x01).
功能:探测传感器上是否按有手指.
输入参数:无
输出参数:无
返回值:(1B,如下列出情况)
MX_OK(0x00) 按着手指;
MX_COMM_ERR(0x01) 收包有错 (即通讯错误);
MX_NO_FINGER(0x02) 没有手指。
编者:ZSJ
修改:
*********************************************************************/
bit CmdDetectFinger()
{ ES=1;
Delay_163us();
PackSendDat(0,1,0x01,0,0,0);
TimeDoorOpenCnt=0;
BPreventStop=1;
StartSeriSendDat();//发协议头0xC0,启动串口发送;然后在串口中断中将缓冲区中的所有数据发送出去.
//BDatRevOk=0;
LableBitVar&=0xfe;
//while(!BDatRevOk); //等待串口应答包完成
while((LableBitVar&0x01)==0x00)
{ DOG=~DOG;
if(TimeDoorOpenCnt>30)
{break;}
}
BPreventStop=0;
TimeDoorOpenCnt=0;
ES=0;
return(UnpackRevDat(/*0,*/0x01,InputPwCnt_RevDatLenth));
}
/********************************************************************
简介:录图像(指令0x02).
功能:从传感器录入指纹图像存于指纹模块的ImageBuffer,并返回有效
面积百分比,上下左右边界等5个参数到外部.
要开辟的areaBorder[4]缓冲区.
输入参数:无
输出参数:(4B,如下)
areaBorder[0]-指纹图像面积;
areaBorder[1]-指纹图像上界;
areaBorder[2]-指纹图像左界;
areaBorder[3]-指纹图像右界.
返回值:(1B,如下列出情况)
MX_OK(0x00) 录入成功;
MX_COMM_ERR(0x01) 收包有错 (即通讯错误);
MX_GET_IMG_ERR(0x03) 录入不成功。
编者:ZSJ
修改:
*********************************************************************/
bit CmdGetImage(/*Uchar* areaBorder*/)
{ ES=1;
Delay_163us();
PackSendDat(0,1,0x02,0,0,0);
TimeDoorOpenCnt=0;
BPreventStop=1;
StartSeriSendDat();//发协议头0xC0,启动串口发送;然后在串口中断中将缓冲区中的所有数据发送出去.
//BDatRevOk=0;
LableBitVar&=0xfe;
//while(!BDatRevOk); //等待串口应答包完成
while((LableBitVar&0x01)==0x00)
{ DOG=~DOG;
if(TimeDoorOpenCnt>100)
{break;}
}
BPreventStop=0;
TimeDoorOpenCnt=0;
ES=0;
return(UnpackRevDat(/*0,*/0x02,InputPwCnt_RevDatLenth));//解开应答包,并返回应答码及结果.
}
/********************************************************************
简介:生成特征(指令0x03).
功能:根据系统配置表中定义的生成特征类型,由存于指纹模块的ImageBuffer
中的原始图像生成指纹特征文件存于CharBufferA或CharBufferB.
输入参数:iBufferID-缓冲区号(1B)(具体如下)
iBufferID =CHAR_BUFFER_A 表示缓冲区CharBufferA,代号0x01
iBufferID =CHAR_BUFFER_B 表示缓冲区CharBufferB,代号0x02
iBufferID =MODEL_BUFFER 表示缓冲区ModelBuffer,代号0x03
输出参数:无
返回值:(1B,如下列出情况)
MX_OK(0x00) 生成特征成功;
MX_COMM_ERR(0x01) 收包有错 (即通讯错误);
MX_FP_TOO_DRY(0x04) 指纹太干,太淡而生不成特征;
MX_FP_TOO_WET(0x05) 指纹太湿,太糊而生不成特征;
MX_FP_DISORDER(0x06) 指纹太乱而生不成特征;
MX_LITTLE_FEATURE(0x07) 指纹正常,但特征点太少而生不成特征;
MX_INVALID_IMAGE(0x15) 图像缓冲区内没有有效原始图而生不成特征。
编者:ZSJ
修改:
*********************************************************************/
bit CmdGenTemplet(Uchar iBufferID)
{ ES=1;
Delay_163us();
PackSendDat(0,2,0x03,1,0,iBufferID);
TimeDoorOpenCnt=0;
BPreventStop=1;
StartSeriSendDat();//发协议头0xC0,启动串口发送;然后在串口中断中将缓冲区中的所有数据发送出去.
//BDatRevOk=0;
LableBitVar&=0xfe;
//while(!BDatRevOk); //等待串口应答包完成
while((LableBitVar&0x01)==0x00)
{ DOG=~DOG;
if(TimeDoorOpenCnt>100)
{break;}
}
BPreventStop=0;
TimeDoorOpenCnt=0;
ES=0;
return(UnpackRevDat(/*0,*/0x03,InputPwCnt_RevDatLenth));//解开应答包,并返回应答码及结果.
}
#if NOUSE==1
/********************************************************************
简介:精确比对(指令0x04).
功能:精确比对CharBufferA与CharBufferB中的特征文件.
输入参数:无
输出参数:目前为NULL,以后扩展为在iScore中返回比对分数
返回值:(1B,如下列出情况)
MX_OK(0x00) 指纹匹配;
MX_COMM_ERR(0x01) 收包有错 (即通讯错误);
MX_NOT_MATCH(0x08) 指纹不匹配。
编者:ZSJ
修改:
*********************************************************************/
bit CmdMatchTwoTemplet(/*Uint* iScore*/)
{ ES=1;
Delay_163us();
PackSendDat(0,1,0x04,0,0,0);
TimeDoorOpenCnt=0;
BPreventStop=1;
StartSeriSendDat();//发协议头0xC0,启动串口发送;然后在串口中断中将缓冲区中的所有数据发送出去.
//BDatRevOk=0;
LableBitVar&=0xfe;
//while(!BDatRevOk); //等待串口应答包完成
while((LableBitVar&0x01)==0x00)
{ DOG=~DOG;
if(TimeDoorOpenCnt>100)
{break;}
}
BPreventStop=0;
TimeDoorOpenCnt=0;
ES=0;
return(UnpackRevDat(/*0,*/0x04,InputPwCnt_RevDatLenth));//解开应答包,并返回应答码及应答结果.
}
#endif
/********************************************************************
简介:搜索指纹库(1:n搜索,指令0x25/0x05 分级/不分级).
功能:以CharBufferA或CharBufferB中的特征文件搜索整个或部分指纹库。
若搜索到,则返回页码与用户信息区内容.
输入参数:iBufferID-缓冲区号(1B)(具体如下)
iStartPage-0<搜索起始页(2B)<FLASH库最大容量
iPageNum-搜索页数(2B)
iBufferID =CHAR_BUFFER_A 表示缓冲区CharBufferA,代号0x01
iBufferID =CHAR_BUFFER_B 表示缓冲区CharBufferB,代号0x02
iBufferID =MODEL_BUFFER 表示缓冲区ModelBuffer,代号0x03
输出参数:*iMbAddress-搜索到的指纹模板在flash中的页码(2B还不确定)
sUserInfo-用户信息内容指针,此内存为32B大小
返回值:(1B,如下列出情况)
MX_OK(0x00) 搜索到;
MX_COMM_ERR(0x01) 收包有错 (即通讯错误);
MX_NOT_SEARCHED(0x09) 没搜到,此时页码与用户信息均为0。
编者:ZSJ
修改:
*********************************************************************/
bit CmdSearch(Uchar iBufferID,Uint iStartPage,Uint iPageNum/*,
Uint *iMbAddress,Uchar* sUserInfo*/)
{
Ulong Para;
Para=iBufferID;
ES=1;
Delay_163us();
if(iPageNum)
{Para=(Para<<16)+iPageNum;}
if(!iPageNum)
{PackSendDat(0,2,0x25,1,0,Para);}
else
{PackSendDat(0,6,0x05,3,iStartPage,Para);}
TimeDoorOpenCnt=0;
BPreventStop=1;
StartSeriSendDat();//发协议头0xC0,启动串口发送;然后在串口中断中将缓冲区中的所有数据发送出去.
//BDatRevOk=0;
LableBitVar&=0xfe;
//while(!BDatRevOk); //等待串口应答包完成
while((LableBitVar&0x01)==0x00)
{ DOG=~DOG;
if(TimeDoorOpenCnt>40)
{break;}
}
BPreventStop=0;
TimeDoorOpenCnt=0;
ES=0;
//解开应答包,并返回应答码及应答结果.
if(!iPageNum)
{return(UnpackRevDat(/*0,*/0x25,InputPwCnt_RevDatLenth));}
else
{return(UnpackRevDat(/*0,*/0x05,InputPwCnt_RevDatLenth));}
}
/********************************************************************
简介:合并特征(指令0x06).
功能:将CharBufferA与CharBufferB中的特征文件合并生成模板,结果存于ModeBuffer.
输入参数:无
输出参数:无
返回值:(1B,如下列出情况)
MX_OK(0x00) 合并成功;
MX_COMM_ERR(0x01) 收包有错 (即通讯错误);
MX_MERGE_ERR(0x0a) 合并失败(两枚指纹不属于同一手指)。
编者:ZSJ
修改:
*********************************************************************/
bit CmdMergeTwoTemple()
{ ES=1;
PackSendDat(0,1,0x06,0,0,0);
TimeDoorOpenCnt=0;
BPreventStop=1;
StartSeriSendDat();//发协议头0xC0,启动串口发送;然后在串口中断中将缓冲区中的所有数据发送出去.
//BDatRevOk=0;
LableBitVar&=0xfe;
//while(!BDatRevOk); //等待串口应答包完成
while((LableBitVar&0x01)==0x00)
{ DOG=~DOG;
if(TimeDoorOpenCnt>30)
{break;}
}
BPreventStop=0;
TimeDoorOpenCnt=0;
ES=0;
return(UnpackRevDat(/*0,*/0x06,InputPwCnt_RevDatLenth));//解开应答包,并返回应答码及应答结果.
}
/********************************************************************
简介:存储模板(指令0x07).
功能:将ModelBuffer中的模板文件存到TimeOneMinuteCnt_PageId号flash数据库位置.
输入参数:iBufferID-缓冲区号(1B),目前为MODEL_BUFFER表示ModelBuffer,代号0x03;
ITimeOneMinuteCnt_PageId-指纹库位置号 >0
输出参数:无
返回值:(1B,如下列出情况)
MX_OK(0x00) 储存成功;
MX_COMM_ERR(0x01) 通讯错误;
MX_ADDRESS_OVER(0x0b) TimeOneMinuteCnt_PageId超出指纹库范围。
编者:ZSJ
修改:
*********************************************************************/
bit CmdStoreTemplet(Uchar iBufferID,Uint iTimeOneMinuteCnt_PageId)
{ Ulong Para;
Para=iBufferID;
ES=1;
Para=(Para<<16)+iTimeOneMinuteCnt_PageId;
PackSendDat(0,4,0x07,4,0,Para);
TimeDoorOpenCnt=0;
BPreventStop=1;
StartSeriSendDat();//发协议头0xC0,启动串口发送;然后在串口中断中将缓冲区中的所有数据发送出去.
//BDatRevOk=0;
LableBitVar&=0xfe;
//while(!BDatRevOk); //等待串口应答包完成
while((LableBitVar&0x01)==0x00)
{ DOG=~DOG;
if(TimeDoorOpenCnt>50)
{break;}
}
BPreventStop=0;
TimeDoorOpenCnt=0;
ES=0;
return(UnpackRevDat(/*0,*/0x07,InputPwCnt_RevDatLenth));//解开应答包,并返回应答码及应答结果.
}
/********************************************************************
简介:读出模板(指令0x08).
功能:将flash数据库中指定ID号的指纹模板读入到模板缓冲区ModelBuffer.
输入参数:iTimeOneMinuteCnt_PageId-指纹库模板号
输出参数:无
返回值:(1B,如下列出情况)
MX_OK(0x00) 读出成功;
MX_COMM_ERR(0x01) 通讯错误;
MX_READ_ERR(0x0c) 读出有错。
编者:ZSJ
修改:
*********************************************************************/
bit CmdLoadTemple(Uint iTimeOneMinuteCnt_PageId)
{ ES=1;
Delay_163us();
PackSendDat(0,3,0x08,5,0,iTimeOneMinuteCnt_PageId);
TimeDoorOpenCnt=0;
BPreventStop=1;
StartSeriSendDat();//发协议头0xC0,启动串口发送;然后在串口中断中将缓冲区中的所有数据发送出去.
//BDatRevOk=0;
LableBitVar&=0xfe;
//while(!BDatRevOk); //等待串口应答包完成
while((LableBitVar&0x01)==0x00)
{ DOG=~DOG;
if(TimeDoorOpenCnt>100)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -