📄 finger_test.c
字号:
#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 + -