菜单

指纹识别驱动

下载

介绍

  指纹识别模块使用的是市面上常见的 AS608 模块,识别速度快,应用广泛。我们对此将其中的实用及重点方法进行了封装。以下为具体功能及使用方法的介绍。

使用方法

加入驱动

添加设备

  右键 设备管理 进行添加,下拉框中选择 其他,进而选择 指纹识别模块

  点击 下一步 直至模块选择完毕

HMI 设置

  指纹识别模块在模拟器中是不生效的,因此我们只需要对 HMI 进行配置即可,按照如下内容对串口进行设置即可

  至此,配置已全部设置完毕。下面将进行 API 讲解及使用方式。

类型介绍

总体介绍

使用类型

  所有的使用方法如下所示

c++ 复制代码
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
  };
};

返回状态

  获得的返回状态如下

c++ 复制代码
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
  };
};

重点介绍

PS_GetImage

  获取指纹图像。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("获取图像",1);

当调用该函数且手指放在传感器上时,会返回成功。返回失败参数可以参考上述返回状态

PS_GenChar

  生成指纹特征。必须先有图像,先执行PS_GetImage,才能生成特征。传入的类型为int,调用方法如下:

c++ 复制代码
// 有两个buffer缓冲区 可以选择传入buffer1:0x01 也可以选择传入buffer2:0x02
vm->setInt("生成特征",0x01);

PS_Match

  对比两次指纹模板特征。需要在两个 buffer 缓冲区中分别生成两个模板。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("比对",1);

PS_RegModel

  生成指纹模板。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("生成模板",1);

PS_StoreChar

  存储模板。需要传入 PageID(即指纹的默认 id),传入的类型为int,调用方法如下:

c++ 复制代码
int pageId = 1;
vm->setInt("存储模板",pageId);

PS_HighSpeedSearch

  在指纹库中高速搜索。需要传入 PageNum(指纹页数),as608 中支持 300 个指纹。传入的类型为int,调用方法如下:

c++ 复制代码
vm->setInt("高速搜索",300);

PS_Empty

  清空指纹库,即删除全部指纹。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("删除全部指纹",1);

PS_DeletChar

  删除单个指纹。需要传入指纹 id。传入的类型为int,调用方法如下:

c++ 复制代码
int pageId = 1;
vm->setInt("删除单个指纹",pageId);

PS_AutoEnroll

  自动注册。完成整体的注册流程,自动注册两次。在执行该过程中,无需将手挪出传感器。需要传入指纹 ID,传入的类型为int,调用方法如下:

c++ 复制代码
int pageId = 1;
vm->setInt("自动注册",pageId);

PS_AutoIdentify

  自动验证。完成整体验证流程。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("自动验证",1);

PS_Cancel

  取消当前正在执行的指令。传入的类型为bool,调用方法如下:

c++ 复制代码
vm->setInt("取消",1);

PS_UpImage

  模块将图片缓冲区的图片上传到用户指定路径。图片格式为.bmp。传入的类型为字符串,调用方法如下:

c++ 复制代码
string upPath = "/customer/prm/images/111.bmp";
vm->setInt("上传到本地",upPath);

PS_DownImage

  将指定路径中的图片上传到图像缓冲区中。图片格式为.bmp,且图片必须是模块上传的图片。传入的类型为字符串,调用方法如下:

c++ 复制代码
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

  ENSURE 分为三个组成部分。我们将通过以下代码对此进行讲解

c++ 复制代码
/**
 * 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);

对于以上代码,有如下总结:

  • getStatus 表示为原指令码,但是对于 PS_UpImagePS_DownImage 而言相对特殊,在指令发送后,会返回相应的指令码,但这并不代表图片已经下发/上传,仅代表指令发送成功。想要获取图片下发/上传,需要使用封装中的自定义指令码:PS_UpImgStatus(下载图片到本地),PS_DnImgStatus(上传图片到模块)
  • PS_AutoEnrollother自动注册状态,注册成功为 1,注册失败为 2
  • PS_HighSpeedSearchPS_AutoIdentifyother用户 id
  • 其余的 other 均为保留位dSignal 表示执行后返回状态

注意

   由于下发/上传图片过大,因此在下发/上传的过程中,从发送命令至获取图片以及图片下传的过程中需要进行 对比起其他指令较长时间的等待 ,图片才能完全下发/上传。在接收到正确回复消息 期间不要进行其他命令的操作

最近修改: 2025-01-03Powered by