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,其他应该都一样的。