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

📄 finger_test.c

📁 基于s3c2410的linux下面指纹识别程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <sys/ioctl.h>#include<time.h>#include <termios.h>                             #include <sys/select.h>  #include <sys/types.h>  //#include "COMM.h"#define ACK_SUCCESS		0x00	// 操作成功
#define	ACK_FAIL		0x01  	// 操作失败
#define	ACK_FULL		0x04  	//  Full
#define ACK_NOUSER		0x05 	// 无此用户
#define	ACK_USER_EXIST	0x07	// 用户已存在
#define	ACK_TIMEOUT		0x08	// 采集超时#define ACK_COUNT		0x3   //发生错误时候,重试次数

extern unsigned char TXBUF[9900];
extern unsigned char RXBUF[9900];
extern unsigned char rev_ok;
extern unsigned int  TX_len;
extern unsigned int  RX_len;extern unsigned char one_onecontrast(unsigned char user_number_h,unsigned char user_number_l);extern unsigned char one_morecontrast(void);extern unsigned char Get_UserNumber_Right(void);extern unsigned char set_addmode(unsigned char yn_repeat);
extern unsigned char add_Fingerprint(unsigned char time_number,unsigned char user_number_h,
								unsigned char user_number_l,unsigned char user_right);extern unsigned char del_alluser(void);extern unsigned char del_oneuser(unsigned char user_number_h,unsigned char user_number_l);extern unsigned char read_usernumber(void);int fd;

unsigned char USER_NUMBER_H;	// 用户号高8位
unsigned char USER_NUMBER_L;	// 用户号低8位
unsigned char USER_RIGHT;		// 用户权限

unsigned char FEATURE_BUFFER[512];	// 要下传的指纹特征值数据
unsigned char FEATURE_LEN;			// 要下传的指纹特征值的长度 unsigned char CharToHex(unsigned char ch);unsigned char select_one_onecontrast(void);void select_Get_Usernumber_right(void);/*********************************************************************************************
* name:		SERIAL_TX
* func:		发生数据到指纹模块串口
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
int SERIAL_TX(void)
{	int ret;	ret = write(fd, TXBUF, TX_len);		// 试图从串口发送数 据						if(ret == -1)				// 确实接收到了数据,并打印出来	{	//	*(rcv_buf+ret)='\0';		printf(" Write device error!\n");		return -1;	//	ret = 0;	} 
	//unsigned int n;
	// TXBUF为要发送的数据,TX_len为要发送的数据的字节数
	//for (n = 0; n < TX_len; n++)
	//{
	//	uart_sendbyteFP(TXBUF[n]);
	//}		return 0;
}

/*********************************************************************************************
* name:		SERIAL_RX
* func:		从指纹模块串口接收数据
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void SERIAL_RX(void)
{      //  read(fd, RXBUF , RX_len);
#if 1 
	int ret,n,pos,retval;	fd_set rfds;	struct timeval tv ;	pos = 0;//指向接收缓冲	tv.tv_sec = 2;	tv.tv_usec = 0;	for(n = 0; n < RX_len; n++)	{		RXBUF[n] = 0xFF;	}		//while(FD_ISSET(fd,&uart_r)||FD_ISSET(fd,&uart_w));	// 检测串口是否有读写动作	while(1)	// 检测串口是否有读写动作	{			FD_ZERO(&rfds);// 清空串口接收端口集		FD_SET(fd,&rfds);// 设置串口接收端口集			retval = select(fd+1,&rfds,NULL,NULL,&tv);			if(retval == -1)		{			perror("select()");			break;		}                              		else if(retval)		{  //判断是否还有数据 			//sleep(2);    							ret = read(fd, RXBUF, RX_len);			pos += ret;			//printf("ret = %d \n",ret);			if((RXBUF[pos-2] == '\r') & (RXBUF[pos-1] == '\n'))				// 确实接收到了数据,并打印出来			{				FD_ZERO(&rfds);				FD_SET(fd,&rfds);					retval = select(fd+1,&rfds,NULL,NULL,&tv);					if(!retval)//no datas				{					break;				}       			} 		}		else		{			break;		} 	}#endif		// 试图从串口接收数 据	//printf("%s\n",RXBUF);//	for(n = 0; n < RX_len; n++)//	{//		printf("%x ",RXBUF[n]);//	}
	// RXBUF为接收到的数据,RX_len为接收的数据的长度

}void show_menu(){	printf("\n");	printf(" ==========================================\n");	printf(" Edukit-IV Fingerprint Identification Test!\n");	printf(" 1: Add Fingerprint for a person.\n");	printf(" 2: Fingerprint matching.\n");	printf(" 3: User manage.\n");	printf(" ==========================================\n");}void init_ttyS(int fd){	struct termios newtio;	bzero(&newtio, sizeof(newtio));	tcgetattr(fd, &newtio);					// 得到当前串口的参数	cfsetispeed(&newtio, B19200);				// 将输入波特率设为19200	cfsetospeed(&newtio, B19200);				// 将输出波特率设为19200	newtio.c_cflag |= (CLOCAL | CREAD);			// 使能接收并使能本地状态	newtio.c_cflag &= ~PARENB;				// 无校验 8位数据位1位停止位	newtio.c_cflag &= ~CSTOPB;	newtio.c_cflag &= ~CSIZE;	newtio.c_cflag |= CS8;	newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);	// 原始数据输入	newtio.c_oflag &= ~(OPOST);	newtio.c_cc[VTIME]    = 0;   				// 设置等待时间和最小接收字符数	newtio.c_cc[VMIN]     = 0;   	tcflush(fd, TCIFLUSH);					// 处理未接收的字符	tcsetattr(fd,TCSANOW,&newtio); 				// 激活新配置}/*********************************************************************************************
* name:		InputUsernumber
* func:		用户从串口输入用户号
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void InputUsernumber()
{
	unsigned char cInput[10] = {0};
	unsigned char c = 0;
	unsigned int n;

	printf("\n Input user ID(0x001-0xFFF)\n");
	//printf("/> ");
	n = 0;	scanf("%c",&c);
	while(n < 3)		
	{
		//c = uart_getchPC();			// 输入用户号
				scanf("%c",&c);		sleep(1);		//c = getchar();
		//printf("%c",c);
		if(((c >= '0') & (c <= '9')) | ((c >= 'A') & (c <= 'F')) | ((c >= 'a') & (c <= 'f')))
		{
			cInput[n++] = c;
		}
		else
		{
			printf("\n Wrong ID.Please input Again:\n");
			//printf("/> ");
			n = 0;
		}
		// 输入用户号为0的情况
		if (n == 3)
		{
			if ((cInput[0] == '0') & (cInput[1] == '0') & (cInput[2] == '0'))
			{
				printf("\n The ID can be 0.Please input Again:\n");
				//printf("/> ");
				n = 0;
			}
		}		
	}
	// 提取用户号
	USER_NUMBER_H = CharToHex(cInput[0]);			// 用户号高8位
	USER_NUMBER_L = CharToHex(cInput[1])*16 + CharToHex(cInput[2]);		// 用户号低8位	//printf("%x + %x \n",USER_NUMBER_H,USER_NUMBER_L);
}

/*********************************************************************************************
* name:		InputUserright
* func:		用户从串口输入用户权限
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void InputUserright()
{
	unsigned char c = 0;
	unsigned int	g_nKeyPress;

	printf("\n Input user right:(1/2/3)\n");
	//printf("/> ");
	g_nKeyPress = 1;	scanf("%c",&c);
	while(g_nKeyPress == 1)		
	{
		//c = uart_getchPC();				// 输入用户权限
				scanf("%c",&c);		sleep(1);		//c = getchar();
		//printf("%c",c);
		if((c == '1') | (c == '2') | (c == '3'))
		{
			break;
		}
		else
		{
			printf("\n Error.Please input Again:\n");
		}	
	}
	// 提取用户权限
	USER_RIGHT = CharToHex(c);
}

/*********************************************************************************************
* name:		CharToHex
* func:		把字符转换为16进制数字,例如'0'变为0x0,'F'变为0xF
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
unsigned char CharToHex(unsigned char ch)
{
	unsigned char HEX;
	// 字符转换为16进制数字
	if ((ch >= '0') & (ch <= '9'))
	{
		HEX = ch - '0';
	}
	else if ((ch >= 'a') & (ch <= 'f'))
	{
		HEX = ch - 'a' + 10;
	}
	else
	{
		HEX = ch - 'A' + 10;
	}
	
	return HEX;
}
/*********************************************************************************************
* name:		select_del_oneuser
* func:		删除指定用户
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void select_del_oneuser()
{
	unsigned char is_ok;
	
	printf("\n Delete a user!\n");
	InputUsernumber();				// 获取用户号

	is_ok = del_oneuser(USER_NUMBER_H, USER_NUMBER_L);
	if (is_ok == ACK_SUCCESS)
	{
		printf("\n Delete a user success!\n");
	}
	else
	{
		printf("\n Delete a user failed!\n");
	}	
}
int select_add_Fingerprint()
{
	unsigned char is_ok;
	unsigned char time_number;		// 第几次添加指纹
	unsigned char FailNumber;

	InputUsernumber();				// 获取用户号
	InputUserright();				// 获取用户权限

	printf("\n Add first...\n");
	time_number = 0x01;				// 第一次添加
	is_ok = ACK_FAIL;
	FailNumber = 0;
	while ((is_ok == ACK_FAIL) & (FailNumber < ACK_COUNT))
	{		
		is_ok = add_Fingerprint(time_number, USER_NUMBER_H, USER_NUMBER_L, USER_RIGHT);

		if (is_ok == ACK_SUCCESS)
		{
			printf(" First OK!\n");			break;
		}
		else if (is_ok == ACK_FULL)
		{
			printf(" Full!\n");
			FailNumber++;
		}
		else if (is_ok == ACK_NOUSER)
		{
			printf(" ID has been exist!\n");
			FailNumber++;
		}
		else
		{			FailNumber++;
			printf(" Error %dth!\n",FailNumber);
			

⌨️ 快捷键说明

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