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

Davidwxj 发表于 2017-10-23 20:37

0晨鹤0 发表于 2017-10-22 19:24
不知道你是用的什么ide,我测试使用arduino和visual studio均编译正常。

好 我在试试其他的

Davidwxj 发表于 2017-10-23 21:13

0晨鹤0 发表于 2017-10-22 19:24
不知道你是用的什么ide,我测试使用arduino和visual studio均编译正常。

换个IDE真的可以了
:L

Davidwxj 发表于 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 = bufferId;
      content = (uint8_t)(startPage >> 8);
      content = (uint8_t)startPage;
      content = (uint8_t)(endPage >> 8);
      content = (uint8_t)endPage;
      sendCmd(8, content);
      uint8_t r = getReply(content);
      if (r == 5) {
                if (content != FPMXX_CODE_OK) *score = 0;
                else {
                        *pageId = content;
                        *pageId <<= 8;
                        *pageId |= content;
                        *score = content;
                        *score <<= 8;
                        *score |= content;
                }
                return content;
      }
      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函数

0晨鹤0 发表于 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参数,用来带回比对的得分(相似度),而第二个函数没有这个参数了。第二个函数只是为了方便调用,因为很多时候并不需要知道得分。

Davidwxj 发表于 2017-10-26 11:18

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

好的最近我也在研究一款指纹识别传感器 电容式的   把你的代码考进去了一直停留在 please scan your fingger   前面的都能显示,可能搜索指纹的命令不一样吧,我得改你的库,以前没编过,看您的码有点困难,还得慢慢来,关于一些移位的、还有就是16进制数组发送、接收的问题还没够清楚,有问题再咨询您

Davidwxj 发表于 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, 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 != Pack_Head ||
                              reply != Pack_Head)
                              //包头不符合
                              return FPMXX_REPLY_BAD_PACKAGE;
                }
                else if (i == 5)
                {
                        if (reply != Adder ||
                              reply != Adder ||
                              reply != Adder ||
                              reply != Adder)
                              //地址不符合
                              return FPMXX_REPLY_BAD_PACKAGE;
                }
                else if (i == 6) pkgType = reply; //取包标识
                else if (i == 8) //取包长度
                {
                        len = reply;
                        len <<= 8;
                        len |= reply;
                }
                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 ||
                        ((uint8_t)sum) != reply)
                        //校验不通过
                        return FPMXX_REPLY_BAD_PACKAGE;

                len -= 2; //去掉最后的校验和
                for (i = 0; i < len; i++) //从确认码开始返回
                        pkg = reply;
                return len;
      }
}
红色部分没有看懂为什么返还len   reply不返还确认码pkg吗然后根据确认吗来判断指令状态 返还包长度有什么意义吗?
还有就是为什么定义
FPMXX_REPLY_TIME_OUT 为0xFF   FPMXX_REPLY_BAD_PACKAGE 为0xFE
指纹识别模块手册规定的吗

0晨鹤0 发表于 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;

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

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

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

关于定义,这个是随便的。因为TIME_OUT和BAD_PACKAGE并不是正常的返回,甚至模块可能根本没有收到我们是请求。所以就自己定义了2个常量用来标识这种错误。

Davidwxj 发表于 2017-10-27 11:31

0晨鹤0 发表于 2017-10-27 11:20
你连复制都复制错了。。正确的代码应该是:                for (i = 0; i < len;...

啊多么痛的领悟:shutup:谢谢

Davidwxj 发表于 2017-11-3 11:03

0晨鹤0 发表于 2017-10-27 11:20
你连复制都复制错了。。正确的代码应该是:                for (i = 0; i < len;...

亲我把你的软串口换成了硬串口Serial1,我应该怎么改呢,我试了下,发包收包有错:Q

0晨鹤0 发表于 2017-11-3 15:36

Davidwxj 发表于 2017-11-3 11:03
亲我把你的软串口换成了硬串口Serial1,我应该怎么改呢,我试了下,发包收包有错 ...

把串口类换成HardwareSerial,其他应该都一样的。
页: 1 [2] 3
查看完整版本: 分享一个刚写完的FPM10光学指纹识别库