分享一个刚写完的FPM10光学指纹识别库
本帖最后由 0晨鹤0 于 2017-5-31 01:31 编辑想改造宿舍门锁开始捣鼓指纹识别。
网上FPM指纹模块的资料比较少,大部分人在用Adafruit的库,感觉这个不是很稳定,经常出UNKNOW错误码,而且封装的函数也比较少。
于是刚学Arduino2天的小白我就自己写了个库(之前是Android程序猿),测试还比较稳定,也封装了好多函数。
各种返回值都有宏定义,比较规范(我是个强迫癌症患者→_→)
理论上FPMxx系列通用,已测试FPM10a
下面是已经封装好的函数,应该满足大部分需求了吧:
/*设置模块地址,用于通讯。不设置默认为0xFFFFFFFF*/
void setCurrentAddress(uint8_t address[]);
/*获取指纹库容量*/
uint16_t getFingerStoreSize(uint16_t *num);
/*获取已有指纹个数*/
uint16_t getFingerNum(uint16_t *num);
/*设置模块安全等级*/
uint8_t setSecurityLevel(uint8_t level);
/*设置模块密码*/
uint8_t setPassword(uint8_t password[]);
/*验证模块密码(非初始密码必须先验证)*/
uint8_t verifyPassword();
uint8_t verifyPassword(uint8_t password[]);
/*录入指纹图像*/
uint8_t getFingerImage();
/*图像生成指纹特征*/
uint8_t image2tz(uint8_t bufferId);
/*2个特征合成指纹模板*/
uint8_t buildTemplate();
/*保存指纹*/
uint8_t storeFinger(uint8_t bufferId, uint16_t pageId);
/*从指纹库读取指纹特征*/
uint8_t loadFinger(uint8_t bufferId, uint16_t pageId);
/*删除指纹*/
uint8_t deleteFinger(uint16_t pageId, uint16_t count);
/*清空指纹库*/
uint8_t emptyFinger();
/*精确比对2个指纹*/
uint8_t contrastFinger(uint16_t * score);
/*搜索指纹库*/
uint8_t searchFinger(uint8_t bufferId, uint16_t startPage, uint16_t endPage, uint16_t *pageId, uint16_t *score);
uint8_t searchFinger(uint8_t bufferId, uint16_t startPage, uint16_t endPage, uint16_t *pageId);
/*以下方法为发送自定义数据及获得响应数据。不推荐使用,尽量用上面封装好的方法。*/
void sendCmd(uint16_t length, uint8_t *content);
uint8_t getReply(uint8_t pkg[], uint16_t timeout);
uint8_t getReply(uint8_t pkg[]);
整个库有中文注释可以参考,例程实现了 清空指纹库→录入指纹→保存指纹→循环搜索匹配指纹 的整个流程。
具体使用说明请移步github:FPMxx-Fingerprint-Sensor4Arduino https://github.com/liangchenhe55/FPMxx-Fingerprint-Sensor4Arduino(弱弱地求star)
只想要库的见附件。
Davidwxj 发表于 2017-11-3 11:03
亲我把你的软串口换成了硬串口Serial1,我应该怎么改呢,我试了下,发包收包有错 ...
把串口类换成HardwareSerial,其他应该都一样的。 本帖最后由 0晨鹤0 于 2017-10-27 11:26 编辑
Davidwxj 发表于 2017-10-27 11:06
uint8_t FPMXX::getReply(uint8_t pkg[], uint16_t timeout)
{
uint16_t timer = 0;
你连复制都复制错了。。正确的代码应该是: for (i = 0; i < len; i++) //从确认码开始返回
pkg = reply;
return len;
返回的数据已经由参数pkg带回了。
因为C++中数组参数是默认传地址的,所以在getReply()函数中修改参数pkg的值,可以把值带回去。
返回len是帮助判断这个返回数据是不是正常。
一般模块的对于某个命令,返回数据的长度大多是固定的,通过长度可以高效地初步判断这个返回数据是否正常,否则要比对返回的字节数组,效率差。
关于定义,这个是随便的。因为TIME_OUT和BAD_PACKAGE并不是正常的返回,甚至模块可能根本没有收到我们是请求。所以就自己定义了2个常量用来标识这种错误。
很棒~后面我试试 :victory:.................. 本帖最后由 O_oYYQ 于 2017-6-1 09:38 编辑
顶一个~~支持一哈 谢谢分享,收藏保存一个。 帮顶帮顶,,哈哈哈哈 本帖最后由 Davidwxj 于 2017-10-11 11:30 编辑
楼主您好,为什么我库导入后示例编译失败啦,提示FPMXX.h第95.96行有问题 Davidwxj 发表于 2017-10-11 11:07
楼主您好,为什么我库导入后示例编译失败啦,提示FPMXX.h第95.96行有问题
麻烦贴一下具体的错误log 0晨鹤0 发表于 2017-10-13 11:29
麻烦贴一下具体的错误log运行的是你的示例,错误提示如下
In file included from FPMXX_Example.ino:2:
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:95: error: a brace-enclosed initializer is not allowed here before '{' token
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:95: error: ISO C++ forbids initialization of member 'Pack_Head'
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:95: error: making 'Pack_Head' static
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:95: error: invalid in-class initialization of static data member of non-integral type 'uint8_t '
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:96: error: a brace-enclosed initializer is not allowed here before '{' token
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:96: error: ISO C++ forbids initialization of member 'Adder'
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:96: error: making 'Adder' static
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:96: error: invalid in-class initialization of static data member of non-integral type 'uint8_t ' Davidwxj 发表于 2017-10-14 08:07
运行的是你的示例,错误提示如下
不知道你是用的什么ide,我测试使用arduino和visual studio均编译正常。