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

📄 fingerpt.c

📁 实现指纹模块采集功能
💻 C
字号:
#pragma large
#include "fingerpt.h"
#if CARD_MODULE == 0
#include <reg52.h>
#include "Timer.h"
#include "Os.h"

/*---------------------- response----------------------*/
#define     mRight      0x81
#define     mReIn       0x82
#define     mEot        0x83
#define     mBusy       0x84

#define     hRight      0x81
#define     hReIn       0x82
#define     hEot        0x83

/*---------------------- command----------------------*/
#define     Reset     	0x00
#define     Status    	0x01
#define     Enroll    	0x03
#define     GenTzz    	0x04
#define     DownMb    	0x05
#define     DownTz    	0x06
#define     UpMb      	0x07
#define     UpTz      	0x08
#define     Store     	0x09
#define     LdBuf    	0x0a
#define     Verify   	0x0b
#define     QuickSearch 0x0c
#define     Search    	0x0d
#define     EraseOne  	0x0e
#define     EraseAll  	0x0f
#define     GenImg     	0x10
#define     UpImg   	0x11
#define     SetAddr   	0x12
#define     Signature 	0x13
#define     SecuLevel 	0x14
#define     DeviceKey 	0x15
#define     Free    	0x16
#define     StorePage 	0x17
#define     LoadPage 	0x18

#define     SysLowSet   0x81
#define     SysHighSet  0x82

#define     SetPwd      0x02
#define     GetInfo     0x20
/*--------------------PkgID----------------------*/
#define     Cmd      0x1<<0
#define     Data     0x1<<1
#define     EndData  0x1<<3


/*指纹模块UART接收缓冲区*/
static UINT8 xdata FingerprintBuffer[256];
static UINT8 idata m_inCounter = 0;    /*接收缓冲区数据导入指针*/
static UINT8 idata m_outCounter = 0;  /*接收缓冲区数据导出指针*/
//static UINT8 idata m_sendFlag = 0;      /* 发送标志位*/
SCMD xdata scmd;                  /*发送指纹数据包变量*/
CMD xdata  cmd;                   /*接收指纹数据包变量*/
UINT8 xdata yanz[8]={0,0,0,0,0,0,0,0};
extern bit FGPT_SendChar;

/*
** define some command package sendding function*/
#define SensorReset()            (SendCmdPkg(Reset))
#define SensorFree()              (SendCmdPkg(Free))
#define SensorGenTzz()          (SendCmdPkg(GenTzz))
#define SensorEnroll()            (SendCmdPkg(Enroll))
#define SensorSearch()           (SendCmdPkg(Search))
#define SensorQuickSearch()  (SendCmdPkg(QuickSearch))
#define SensorVerify()            (SendCmdPkg(Verify))


static void ClearComm(void);
static void ClearComm(void)
{
	m_inCounter = 0;
	m_outCounter = 0;
	OSMemset(FingerprintBuffer,0, 256);
}

UINT8 SendCmdPkg(UINT8 command)
{
        UINT8 xdata m_ret;

	Sleep(10);
    	scmd.sPkgId = Cmd;
	scmd.sPkgLen = 1;
	scmd.sPkgCnt[0] = command;
        m_ret = SendPackage(&scmd);
	return m_ret;
}

/***************************************************************
** BOOL FingerprintInit(void)
****************************************************************
** Function:
**          指纹模块检测及初始化
** *************************************************************/
UINT8 FingerprintInit(void)
{
	UINT8 data ret;
	UINT8 data status0,status1;

 	scmd.sPkgId=EndData;
	scmd.sAddress[0]=3;
	scmd.sAddress[1]=3;
	scmd.sPkgLen=2;
	scmd.sPkgCnt[0]=0;
	scmd.sPkgCnt[1]=1;

	ret = SendPackage(&scmd);
	if(ret == 1)
	{
		ret = SensorDeviceKey(yanz,yanz);
		if(ret == 1)
		{
                     Sleep(40);
			/*等待结果包*/
			ret = GetPackage(&cmd);
			if(((cmd.PkgCnt[0]&0x03) != 3) && (ret == 1))
			{
				ret = 0;
			}
		}
	}

	/*//发送读状态包命令*/
	ret = SensorStatus(&status0,&status1);

	return ret;
}

/****************************************************************
** void FingerprintInt4() interrupt 4 using 3
*****************************************************************
** Function:
**         连接指纹模块的中断程序
** Inputs:
**          None
** Outputs:
**          None
** Returns:
**          None
*****************************************************************/
void FingerprintInt4() interrupt 4 using 3
{
	if(RI)
	{
		RI=0;
		FingerprintBuffer[m_inCounter++] = SBUF;
	}

	if(TI)
	{
		TI = 0;
                FGPT_SendChar = 0;
	}
}


/******************************************************************
** UINT8  GetPkgByte(unsigned char *TranChar)
*******************************************************************
** Function:
**         向指纹UART端口获取一个接收的字节
** Inputs:
**         TranChar    接收一个字节的数据指针
** Outputs:
**         None
** Returns:
**         0 - fail   1-success
*******************************************************************/
UINT8  GetPkgByte(unsigned char *TranChar)
{
	if(m_inCounter != m_outCounter)
	{
		*TranChar = FingerprintBuffer[m_outCounter++];
		return 1;
	}

	return 0;
}

UINT8  SendPkgByte(unsigned char TranChar)
{
	FGPT_SendChar = 1;
	SBUF = TranChar;
	while(FGPT_SendChar);

	return 1;
}

UINT8  GetPackage(CMD *cmd)
{
	UINT8 xdata i,RptTimes;
    UINT16 idata  jyh;

    RptTimes=0;
hostReIn:
    if( !GetPkgByte(&(cmd->PkgId )))
   		return 0;
    if( !GetPkgByte(&(cmd->Address[0]) ) )
       	 return 0;
	if( !GetPkgByte(&(cmd->Address[1] ) ))
       	return 0;
    if( !GetPkgByte(&(cmd->PkgLen)) )
       	 return 0;

    jyh = cmd->PkgId;
    jyh += cmd->Address[0];
    jyh += cmd->Address[1];
    jyh += cmd->PkgLen;

    for( i=0;i<cmd->PkgLen;i++ )
    {
       	if( !GetPkgByte(&(cmd->PkgCnt[i] )) )
           		return 0;
       	jyh+=cmd->PkgCnt[i];
    }
    if( !GetPkgByte(&(cmd->Jyh[0] )) )
       	return 0;
    if( !GetPkgByte(&(cmd->Jyh[1] )) )
       	return 0;

	Sleep(1);
    if( cmd->Jyh[0]!=(jyh&0xff00)>>8 || cmd->Jyh[1]!=(jyh&0xff) )
	{
       	RptTimes++;
		if( RptTimes>3 )
		{
			SendPkgByte(hEot);
            Sleep(1);
            SendPkgByte(hEot );
            return 0;
		}
		SendPkgByte(hReIn );
        Sleep(1);
        SendPkgByte(hReIn );
        ClearComm();
        goto hostReIn;
	}

    SendPkgByte(hRight );
    Sleep(1);
    SendPkgByte(hRight );
    return 1;
}

/***********************************************************
** UINT8  SendPackage(SCMD scmd)
************************************************************
** Function:
**      向指纹UART端口发送一个数据包
** Inputs:
**      scmd
** Outputs:
**      None
** Returns:
**      status value
*************************************************************/
UINT8  SendPackage(SCMD *scmd)
{
	UINT8 data i, ret;
    	UINT16 data jyh;        //unsigned int

	/*caculate chech sum*/
    	jyh=scmd->sPkgId+scmd->sAddress[0]+scmd->sAddress[1]+scmd->sPkgLen;
    	 for( i=0;i<scmd->sPkgLen;i++ )
     	 {
     		jyh += scmd->sPkgCnt[i];
     	 }
    	 scmd->sJyh[0] =(UINT8) ((jyh >> 8) & 0xFF);
    	 scmd->sJyh[1]=(UINT8)(jyh & 0xff);

ModuleReIn:
    	ClearComm();
    	SendPkgByte(scmd->sPkgId);
    	SendPkgByte(scmd->sAddress[0]);
	SendPkgByte(scmd->sAddress[1]);
	SendPkgByte(scmd->sPkgLen);

	 for( i=0;i<scmd->sPkgLen;i++ )
	 {
	      SendPkgByte(scmd->sPkgCnt[i]);
	 }

	 SendPkgByte(scmd->sJyh[0] );
	 SendPkgByte(scmd->sJyh[1]);

	    Sleep(2);

	if( !GetPkgByte(&ret ) )
        return 0;
    if( !GetPkgByte(&ret ) )
        return 0;

    if( ret == mReIn )
	    goto ModuleReIn;
    if( ret == mRight )
        return 1;
	if( ret == mBusy )
        return 2;
    return 0;
}

UINT8 SensorDeviceKey(unsigned char OldPwd[8],unsigned char NewPwd[8])
{
	int ret,i;

	ret = SendCmdPkg(DeviceKey);
	if( !ret )
		return 0;
    if( ret==2 )
		return 2;

	Sleep(3);
	for( i=0;i<=7;i++ )
	{
		scmd.sPkgCnt[i]=OldPwd[i];
		scmd.sPkgCnt[8+i]=NewPwd[i];
	}
	scmd.sPkgId=EndData;
	scmd.sPkgLen=16;
	return( SendPackage(&scmd) );
}

UINT8 SensorStatus(unsigned char* St0,unsigned char* St1)
{
	UINT8 ret;

	ret = SendCmdPkg(Status);
	if( ret==2 )
		return 2;                   //busy
	if( ret==1 )
	{
                Sleep(30);
		if( GetPackage(&cmd) )
		{
			*St0=cmd.PkgCnt[0];
			*St1=cmd.PkgCnt[1];
			return 1;
		}
	}
    return 0;
}


UINT8 SensorDownMb(int nummb,TZDP mb[],int DampMbLock)
{
	int i,ptr;
	UINT8 ret;

	ret = SendCmdPkg(DownMb);

	if(ret != 1)
    		return ret;

	Sleep(3);
	for( i=0,ptr=0;i<nummb;i++ )
    {
        scmd.sPkgCnt[ptr++]=mb[i].hres;
        scmd.sPkgCnt[ptr++]=mb[i].zres;
        scmd.sPkgCnt[ptr++]=mb[i].flag+((mb[i].direct/256)<<7);
        scmd.sPkgCnt[ptr++]=mb[i].direct%256;
    }

    //---add ----
    if( DampMbLock<0 )
		DampMbLock=0;
    if( DampMbLock>7 )
		DampMbLock=7;
    scmd.sPkgCnt[ptr++]=DampMbLock;
    scmd.sPkgId=EndData;
    scmd.sPkgLen=ptr;
    return( SendPackage(&scmd) );
}

UINT8 SensorDownTz(int numtzd,TZDP tzd[],int DampFinger)
{
	int i,ptr;
	UINT8 ret;

    	ret = SendCmdPkg(DownTz);

    	if(ret != 1)
    		return ret;

	Sleep(1);
	for( i=0,ptr=0;i<numtzd && i<=31;i++ )
    {
        scmd.sPkgCnt[ptr++]=tzd[i].hres;
        scmd.sPkgCnt[ptr++]=tzd[i].zres;
        scmd.sPkgCnt[ptr++]=tzd[i].flag+((tzd[i].direct/256)<<7);
        scmd.sPkgCnt[ptr++]=tzd[i].direct%256;
    }
	if(numtzd>32)
		scmd.sPkgId=Data;
	else
	{
		scmd.sPkgId=EndData;
        //---add---
		scmd.sPkgCnt[ptr-2]=scmd.sPkgCnt[ptr-2]+DampFinger*16;
	}
    scmd.sPkgLen=ptr;
    if( !SendPackage(&scmd) )
        return 0;
	if( numtzd<=32 )
		return 1;

	Sleep(3);
	for( i=32,ptr=0;i<numtzd && i<=31+32;i++ )
    {
        scmd.sPkgCnt[ptr++]=tzd[i].hres;
        scmd.sPkgCnt[ptr++]=tzd[i].zres;
        scmd.sPkgCnt[ptr++]=tzd[i].flag+((tzd[i].direct/256)<<7);
        scmd.sPkgCnt[ptr++]=tzd[i].direct%256;
    }
	//---add---
	scmd.sPkgCnt[ptr-2]=scmd.sPkgCnt[ptr-2]+DampFinger*16;

	scmd.sPkgId=EndData;
    scmd.sPkgLen=ptr;
    return( SendPackage(&scmd) );
}

UINT8 SensorUpMb(int* nummb,TZDP mb[],int* DampMbLock)
{
	int i,ptr;
	UINT8 ret;

	ret = SendCmdPkg(UpMb);

	if(ret != 1)
		return ret;

	if( !GetPackage(&cmd) )
        return 0;
    if( cmd.PkgId!=EndData )
        return 0;
    *nummb=cmd.PkgLen/4;
    ptr=0;
    for( i=0;i<*nummb;i++ )
    {
       mb[i].hres=cmd.PkgCnt[ptr++];
       mb[i].zres=cmd.PkgCnt[ptr++];
       mb[i].flag=cmd.PkgCnt[ptr++];
       mb[i].direct=cmd.PkgCnt[ptr++];
       if(mb[i].flag&0x80)
       {
           mb[i].direct+=256;
           mb[i].flag&=0x7f;
       }
	}

	//---add---
	*DampMbLock=cmd.PkgCnt[ptr];

    return 1;
}

UINT8 SensorUpTz(int *numtzd,TZDP tzd[],int* DampFinger)
{
	int i,ptr;
	UINT8 ret;

	ret = SendCmdPkg(UpTz);
	if(ret != 1)
		return ret;

	if( !GetPackage(&cmd) )
        return 0;
    if( cmd.PkgId!=EndData && cmd.PkgId!=Data )
        return 0;
    i=0;
    *numtzd=0;
anothertzz:
    *numtzd+=cmd.PkgLen/4;
    ptr=0;
    for( ;i<*numtzd;i++ )
    {
        tzd[i].hres=cmd.PkgCnt[ptr++];
        tzd[i].zres=cmd.PkgCnt[ptr++];
        tzd[i].flag=cmd.PkgCnt[ptr++];
        tzd[i].direct=cmd.PkgCnt[ptr++];
        if(tzd[i].flag&0x80)
        {
            tzd[i].direct+=256;
            tzd[i].flag&=0x7f;
        }
	}
    if( !(cmd.PkgId&EndData) )
    {
        i=*numtzd;
        if( !GetPackage(&cmd) )
                return 0;
        else
        {
            if( cmd.PkgId!=EndData )
                return 0;
        }
        goto anothertzz;
	}
	//---add---
	*DampFinger=tzd[*numtzd-1].flag/16;
    tzd[*numtzd-1].flag=tzd[*numtzd-1].flag&0x0f;

	return 1;
}

UINT8  SensorGetInfo(UINT8 *info)
{
	UINT8 data  ret;

	ret = SendCmdPkg(GetInfo);

	if(ret != 1)
		return ret;

	if( GetPackage(&cmd) )
	{
		*info=cmd.PkgCnt[0];
		return 1;
	}
	return 0;
}

#endif

⌨️ 快捷键说明

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