指纹识别模块使用的是市面上常见的 AS608 模块,识别速度快,应用广泛。我们对此将其中的实用及重点方法进行了封装。以下为具体功能及使用方法的介绍。
右键 设备管理 进行添加,下拉框中选择 其他,进而选择 指纹识别模块
点击 下一步 直至模块选择完毕
指纹识别模块在模拟器中是不生效的,因此我们只需要对 HMI 进行配置即可,按照如下内容对串口进行设置即可
至此,配置已全部设置完毕。下面将进行 API 讲解及使用方式。
所有的使用方法如下所示
class AS608CODE{
public:
enum {
/**获取指纹图像*/
PS_GetImage = 0x01,
/**生成特征*/
PS_GenChar = 0x02,
/**对比两次指纹*/
PS_Match = 0x03,
/**生成指纹模板*/
PS_RegModel = 0x05,
/**储存模板*/
PS_StoreChar = 0x06,
/**搜索指纹*/
PS_HighSpeedSearch = 0x1b,
/**删除所有指纹*/
PS_Empty = 0x0d,
/**删除单个特征*/
PS_DeletChar = 0x0c,
/**自动注册*/
PS_AutoEnroll = 0x31,
/**自动验证*/
PS_AutoIdentify = 0x32,
/**取消指令*/
PS_Cancel = 0x30,
/**下载图像*/
PS_DownImage = 0x0b,
/**上传图像*/
PS_UpImage = 0x0a,
/**下载到上位机图片状态*/
PS_UpImgStatus = 0x88,
/**上传到模块图片状态*/
PS_DnImgStatus = 0x99
};
};
获得的返回状态如下
class AS608REPLY{
public:
enum {
/**指令执行完毕或 OK*/
MR_OK = 0x00,
/**数据包接收错误*/
MR_PACK_RECIVE_ERR = 0x01,
/**传感器上没有手指*/
MR_NOFINGER = 0x02,
/**录入指纹图像失败*/
MR_ENROLLERR = 0x03,
/**指纹库满*/
MR_TOODRY = 0x04,
/**指纹图像太干、太淡而生不成特征*/
MR_TOOWET = 0x05,
/**指纹图像太乱而生不成特征*/
MR_TOOMESSY = 0x06,
/**指纹图像正常,但特征点太少(或面积太小)而生不成特征*/
MR_TOOFEW = 0x07,
/** 指纹不匹配*/
MR_NOMATCH = 0x08,
/**没搜索到指纹*/
MR_NOSEARCH = 0x09,
/**特征合并失败*/
MR_MERGEERR = 0x0a,
/**访问指纹库时地址序号超出指纹库范围*/
MR_OUTRAGE = 0x0b,
/**从指纹库读模板出错或无效*/
MR_READCHAERR = 0x0c,
/**上传特征失败*/
MR_UPLOADCHAERR = 0x0d,
/**模块不能接受后续数据包*/
MR_LOSTDATA = 0x0e,
/**上传图像失败*/
MR_UPLOADPICERR = 0x0f,
/**删除模板失败*/
MR_DELCHAERR = 0x10,
/**清空指纹库失败*/
MR_EMPTYCHAERR = 0x11,
/**口令不正确*/
MR_PWERR = 0x13,
/**缓冲区内没有有效原始图而生不成图像*/
MR_NOIMG = 0x15,
/**读写 FLASH 出错*/
MR_FLAHSERR = 0x18,
/**未定义错误*/
MR_UNDEFERR = 0x19,
/**无效寄存器号*/
MR_NOREG = 0x1a,
/**寄存器设定内容错误号*/
MR_REGERR = 0x1b,
/**记事本页码指定错误*/
MR_NOTEPAGEERR = 0x1c,
/**端口操作失败*/
MR_PORTERR = 0x1d,
/**自动注册(enroll)失败*/
MR_AUTOENROLLERR = 0x1e,
/**指纹库满*/
MR_CHARFULL = 0x1f
};
};
获取指纹图像。传入的类型为bool
,调用方法如下:
vm->setInt("获取图像",1);
当调用该函数且手指放在传感器上时,会返回成功。返回失败参数可以参考上述返回状态
生成指纹特征。必须先有图像,先执行PS_GetImage
,才能生成特征。传入的类型为int
,调用方法如下:
// 有两个buffer缓冲区 可以选择传入buffer1:0x01 也可以选择传入buffer2:0x02
vm->setInt("生成特征",0x01);
对比两次指纹模板特征。需要在两个 buffer 缓冲区中分别生成两个模板。传入的类型为bool
,调用方法如下:
vm->setInt("比对",1);
生成指纹模板。传入的类型为bool
,调用方法如下:
vm->setInt("生成模板",1);
存储模板。需要传入 PageID(即指纹的默认 id),传入的类型为int
,调用方法如下:
int pageId = 1;
vm->setInt("存储模板",pageId);
在指纹库中高速搜索。需要传入 PageNum(指纹页数),as608 中支持 300 个指纹。传入的类型为int
,调用方法如下:
vm->setInt("高速搜索",300);
清空指纹库,即删除全部指纹。传入的类型为bool
,调用方法如下:
vm->setInt("删除全部指纹",1);
删除单个指纹。需要传入指纹 id。传入的类型为int
,调用方法如下:
int pageId = 1;
vm->setInt("删除单个指纹",pageId);
自动注册。完成整体的注册流程,自动注册两次。在执行该过程中,无需将手挪出传感器。需要传入指纹 ID,传入的类型为int
,调用方法如下:
int pageId = 1;
vm->setInt("自动注册",pageId);
自动验证。完成整体验证流程。传入的类型为bool
,调用方法如下:
vm->setInt("自动验证",1);
取消当前正在执行的指令。传入的类型为bool
,调用方法如下:
vm->setInt("取消",1);
模块将图片缓冲区的图片上传到用户指定路径。图片格式为.bmp
。传入的类型为字符串
,调用方法如下:
string upPath = "/customer/prm/images/111.bmp";
vm->setInt("上传到本地",upPath);
将指定路径中的图片上传到图像缓冲区中。图片格式为.bmp
,且图片必须是模块上传的图片。传入的类型为字符串
,调用方法如下:
string dnPath = "/customer/prm/images/111.bmp";
vm->setInt("下载到模块",dnPath);
至此,重点函数已全部介绍完毕。
数据类型如下表所示:
名称 | 类型 |
---|---|
PS_GetImage,PS_Match,PS_RegModel,PS_Empty,PS_AutoIdentify,PS_Cancel | bool |
PS_UpImage,PS_DownImage | 字符串 |
PS_DeletChar,PS_AutoEnroll,PS_StoreChar,PS_GenChar,PS_HighSpeedSearch | int |
本驱动封装了返回值ENSURE
用于返回各种指令的组合值,下面是具体介绍:
ENSURE 分为三个组成部分。我们将通过以下代码对此进行讲解
/**
* getStatus uint8_t类型
高24位
* 0x01 PS_GetImage
* 0x02 PS_GenChar
* 0x03 PS_Match
* 0x05 PS_RegModel
* 0x06 PS_StoreChar
* 0x1b PS_HighSpeedSearch
* 0x0d PS_Empty
* 0x0c PS_DeletChar
* 0x31 PS_AutoEnroll ...
*
* dSignal如果是0x00 表示成功 其他的参数可以对应reply中的各类参数进行判断 uint8_t类型 高16位
*
* other 在PS_AutoEnroll 为自动注册的状态 PS_HighSpeedSearch为用户id PS_AutoIdentify为用户id 其他的作为保留参数 默认为0 uint16_t类型 低16位
*/
long long reply;
vm->getLong("返回内容",reply);
int getStatus = (reply >> 24) & 0xFF;
printf("getStatus=======%02x\n",getStatus);
int dSignal = (reply >> 16) & 0xFF;
printf("dSignal=======%02x\n",dSignal);
int other = reply & 0xFFFF;
printf("other=======%02x\n",other);
对于以上代码,有如下总结:
PS_UpImgStatus
(下载图片到本地),PS_DnImgStatus
(上传图片到模块)由于下发/上传图片过大,因此在下发/上传的过程中,从发送命令至获取图片以及图片下传的过程中需要进行 对比起其他指令较长时间的等待 ,图片才能完全下发/上传。在接收到正确回复消息 期间不要进行其他命令的操作 。