分享一个刚写完的FPM10光学指纹识别库-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: 0晨鹤0

分享一个刚写完的FPM10光学指纹识别库

[复制链接]
发表于 2017-10-23 20:37 | 显示全部楼层
0晨鹤0 发表于 2017-10-22 19:24
不知道你是用的什么ide,我测试使用arduino和visual studio均编译正常。

好 我在试试其他的
发表于 2017-10-23 21:13 | 显示全部楼层
0晨鹤0 发表于 2017-10-22 19:24
不知道你是用的什么ide,我测试使用arduino和visual studio均编译正常。

换个IDE真的可以了
发表于 2017-10-25 16:46 | 显示全部楼层
本帖最后由 Davidwxj 于 2017-10-25 16:47 编辑
0晨鹤0 发表于 2017-10-22 19:24
不知道你是用的什么ide,我测试使用arduino和visual studio均编译正常。

uint8_t FPMXX::searchFinger(uint8_t bufferId, uint16_t startPage, uint16_t endPage, uint16_t * pageId, uint16_t * score)
{
        uint8_t content[] = { 0x01,0x00,0x08,0x04,0x00,0xFF,0xFF,0x00,0x00 };
        content[4] = bufferId;
        content[5] = (uint8_t)(startPage >> 8);
        content[6] = (uint8_t)startPage;
        content[7] = (uint8_t)(endPage >> 8);
        content[8] = (uint8_t)endPage;
        sendCmd(8, content);
        uint8_t r = getReply(content);
        if (r == 5) {
                if (content[0] != FPMXX_CODE_OK) *score = 0;
                else {
                        *pageId = content[1];
                        *pageId <<= 8;
                        *pageId |= content[2];
                        *score = content[3];
                        *score <<= 8;
                        *score |= content[4];
                }
                return content[0];
        }
        return r;
}

uint8_t FPMXX::searchFinger(uint8_t bufferId, uint16_t startPage, uint16_t endPage, uint16_t * pageId)
{
        uint16_t s;
        return searchFinger(bufferId, startPage, endPage, pageId, &s);
}

亲  没看懂这里  为什么要有两个searchFinger函数
 楼主| 发表于 2017-10-25 18:33 | 显示全部楼层
Davidwxj 发表于 2017-10-25 16:46
uint8_t FPMXX::searchFinger(uint8_t bufferId, uint16_t startPage, uint16_t endPage, uint16_t * page ...

注释上都写了的。第一个searchFinger()函数有*score参数,用来带回比对的得分(相似度),而第二个函数没有这个参数了。第二个函数只是为了方便调用,因为很多时候并不需要知道得分。

发表于 2017-10-26 11:18 | 显示全部楼层
0晨鹤0 发表于 2017-10-25 18:33
注释上都写了的。第一个searchFinger()函数有*score参数,用来带回比对的得分(相似度),而第二个函数没 ...

好的  最近我也在研究一款指纹识别传感器 电容式的   把你的代码考进去了  一直停留在 please scan your fingger   前面的都能显示,可能搜索指纹的命令不一样吧,我得改你的库,以前没编过,看您的码有点困难,还得慢慢来,关于一些移位的、还有就是16进制数组发送、接收的问题还没够清楚,有问题再咨询您
发表于 2017-10-27 11:06 | 显示全部楼层
本帖最后由 Davidwxj 于 2017-10-27 11:10 编辑
0晨鹤0 发表于 2017-10-25 18:33
注释上都写了的。第一个searchFinger()函数有*score参数,用来带回比对的得分(相似度),而第二个函数没 ...

uint8_t FPMXX::getReply(uint8_t pkg[], uint16_t timeout)
{
        uint16_t timer = 0;
        uint16_t len = 0; //通信协议中包长度的值
        uint8_t reply[40], i = 0;
        uint8_t pkgType; //通信协议中包标识的值
        while (1)
        {
                while (!mySerial->available())
                {
                        delay(1);
                        timer++;
                        if (timer >= timeout) return FPMXX_REPLY_TIME_OUT;
                }

                reply = mySerial->read();
                //Serial.println(reply,HEX);

                //检查数据
                if (i == 1)
                {
                        if (reply[0] != Pack_Head[0] ||
                                reply[1] != Pack_Head[1])
                                //包头不符合
                                return FPMXX_REPLY_BAD_PACKAGE;
                }
                else if (i == 5)
                {
                        if (reply[2] != Adder[0] ||
                                reply[3] != Adder[1] ||
                                reply[4] != Adder[2] ||
                                reply[5] != Adder[3])
                                //地址不符合
                                return FPMXX_REPLY_BAD_PACKAGE;
                }
                else if (i == 6) pkgType = reply[6]; //取包标识
                else if (i == 8) //取包长度
                {
                        len = reply[7];
                        len <<= 8;
                        len |= reply[8];
                }
                if (i == 8 + len) break; //因为i从0开始所以不是9而是8
                i++;
        }

        //数据接收完毕
        if (i == 8 + len)
        {
                //校验
                uint16_t sum = 0;
                for (i = 6; i < 6 + len + 1; i++)
                        sum += reply;

                if (((uint8_t)(sum >> 8)) != reply[7 + len] ||
                        ((uint8_t)sum) != reply[8 + len])
                        //校验不通过
                        return FPMXX_REPLY_BAD_PACKAGE;

                len -= 2; //去掉最后的校验和
                for (i = 0; i < len; i++) //从确认码开始返回
                        pkg = reply[9 + i];
                return len;

        }
}
红色部分没有看懂  为什么返还len   reply不返还确认码pkg吗  然后根据确认吗来判断指令状态 返还包长度有什么意义吗?
还有就是为什么定义

FPMXX_REPLY_TIME_OUT 为0xFF   FPMXX_REPLY_BAD_PACKAGE 为0xFE
指纹识别模块手册规定的吗
 楼主| 发表于 2017-10-27 11:20 | 显示全部楼层
本帖最后由 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;

你连复制都复制错了。。正确的代码应该是:[mw_shl_code=cpp,true]                for (i = 0; i < len; i++) //从确认码开始返回
                        pkg = reply[9 + i];
                return len;[/mw_shl_code]

返回的数据已经由参数pkg带回了。
因为C++中数组参数是默认传地址的,所以在getReply()函数中修改参数pkg的值,可以把值带回去。

返回len是帮助判断这个返回数据是不是正常。
一般模块的对于某个命令,返回数据的长度大多是固定的,通过长度可以高效地初步判断这个返回数据是否正常,否则要比对返回的字节数组,效率差。

关于定义,这个是随便的。因为TIME_OUT和BAD_PACKAGE并不是正常的返回,甚至模块可能根本没有收到我们是请求。所以就自己定义了2个常量用来标识这种错误。
发表于 2017-10-27 11:31 | 显示全部楼层
0晨鹤0 发表于 2017-10-27 11:20
你连复制都复制错了。。正确的代码应该是:[mw_shl_code=cpp,true]                for (i = 0; i < len;  ...

啊  多么痛的领悟    谢谢
发表于 2017-11-3 11:03 | 显示全部楼层
0晨鹤0 发表于 2017-10-27 11:20
你连复制都复制错了。。正确的代码应该是:[mw_shl_code=cpp,true]                for (i = 0; i < len;  ...

亲  我把你的软串口换成了硬串口Serial1,我应该怎么改呢,我试了下,发包收包有错
 楼主| 发表于 2017-11-3 15:36 | 显示全部楼层
Davidwxj 发表于 2017-11-3 11:03
亲  我把你的软串口换成了硬串口Serial1,我应该怎么改呢,我试了下,发包收包有错 ...

把串口类换成HardwareSerial,其他应该都一样的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 11:51 , Processed in 0.107721 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表