你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F103——AS608指纹模块+串口打印

[复制链接]
STMCU小助手 发布时间:2022-8-22 15:37
最近用STM32F103做一个智能门锁小玩意,其中用到指纹模块,我这里也单独的写一下笔记,不过我只是了解了基本的,就是我做门禁卡要用到的几个东西,其它还没了解。为了方便,做一下记录。我这里没有用到按键和显示屏,所以还是串口输出输入来控制了
一: 基本介绍
这里就写一下我这次用到的而且觉得是重点的东西吧 毕竟手册还是内容很多的

AS608引脚描述
这里就留意前6个 其中WAK这个引脚 是可以检测手指是否按下的 当有手指按下 WAK引脚是输出高电平 没有手指则维持低电平

6120ecabe83143eb8878aca193483625.png

AS608模块地址
默认是 0XFFFFFFFF(共4个字节)
我这里就不改了,按默认的了。修改的话请看手册

AS608波特率
默认是57600
我这里也懒得改了,按默认了。修改的话请看手册

AS608指令格式

模块指令格式分为三种,命令包、数据包、结束包。如下图

506d8425baed4bd2988ffdacf3ed476f.png

AS608应答格式


fec34904f95143b1bb3cf23e0739f0f9.png

正常是通过检测确认码来确定数据的反馈
比如:
0X00: OK
0X01: 数据包接收错误
0X02: 传感器没有手指

手册都有说。这里也就不细发了。

二: 指令集

指令集很多,很多,但是我这里就写一下我这次做门禁卡系统用到的一些指令集。最终能实现 增加指纹、删除指纹、验证指纹。

1.读取图像-PS_GetImage
  1. 功能:                 读取指纹图像,然后把图像存放于ImageBuffer中。
  2. 参数:                  无
  3. 返回:                  确认字
  4. 指令代码:         01H
复制代码

简述:
首先我们通过指令码包给AS608指纹模块让它读取图像,然后指纹模块会返回应答包给我们。我们通过应答包的确认字去判断这次的结果。

指令包格式:


c1f7821a436f4ca6aed3937a12c7b348.png

首先我们是我们给指纹模块发送的内容 可以结合上图指令包格式

  1. 1、发送包头:                0XEF01                 (2个字节)
  2. 2、发送芯片地址:        0XFFFFFFFF        (4个字节)
  3. 3、发送包标识:        0X01                (1个字节)
  4. 4、发送包长度:        0X0003                (2个字节)
  5. 5、发送指令码:        0X01                (1个字节)
  6. 6、发送校验和:        0X0005                (2个字节)
复制代码

包长度如何计算的?
我们可以看出来嘛 包长度这个表格是说3个。那么我看后面确实还剩3个字节。1字节的指令码+2字节的校验和 = 3字节。
结论: 包长度: 提示了后面还有多少个字节数据

校验和如何计算的?
我们同样也可以看出来 它的校验和是说是5。那么我们很容易发现,校验和其实是 从 包标识 0x01 + 包长度 0x0003 + 指令码 0x01 = 5。
结论: 校验和 = 包标识开始 + … 到校验和 但不含校验和。

应答包格式

373ff1d83ac7417096fcd7ec80a6093a.png

发送完指令包给指纹模块 我们则会收到它发的应答包 可以结合上图应答包格式

  1. 1、接收到包头:        0XEF01                 (2个字节)
  2. 2、接收到芯片地址        0XFFFFFFFF        (4个字节)
  3. 3、接收到包标识:        0X07                (1个字节)
  4. 4、接收到包长度:        0X0003                (2个字节)
  5. 5、接收到确认码:        xxH                        (1个字节)
  6. 6、接收到校验和:        SUM                        (2个字节)

  7. xxH(确认码):
  8. 00H:                录入成功
  9. 01H:                收包有误
  10. 02H:                没有检测到手指
  11. 03H:                录入不成功

  12. SUM(校验和)
复制代码

2.生成特征-PS_GenChar
  1. 功能:                 将ImageBuffer中的原始图像生成指纹特征存放CharBuffer1 或者 CharBuffer2。
  2. 参数:                  BufferID(特征缓冲区号) CharBuffer1:01H     CharBuffer2:02H
  3. 返回:                  确认字
  4. 指令代码:         02H
复制代码

简述:
首先我们通过指令码包给AS608指纹模块让它读取图像后如果读取到图像,然后我们发送生成特征指令包,然后指纹模块会返回应答包给我们。我们通过应答包的确认字去判断这次的结果。


指令包格式:

c71225ef853749d88142a05a12840ba6.png

首先我们是我们给指纹模块发送的内容 可以结合上图指令包格式

  1. 1、发送包头:                0XEF01                 (2个字节)
  2. 2、发送芯片地址:        0XFFFFFFFF        (4个字节)
  3. 3、发送包标识:        0X01                (1个字节)
  4. 4、发送包长度:        0X0004                (2个字节)
  5. 5、发送指令码:        0X02                (1个字节)
  6. 6、发送缓冲区号:        0x01/0X02        (1个字节)
  7. 7、发送校验和:        SUM                        (2个字节)

  8. SUM(校验和的计算):
  9. 校验和 = 包标识 + 包长度 + 指令码 + 缓冲区号(BufferID)。

  10. 1:当你发送的缓冲区号是0x01时: 校验和 = 0x08
  11. 0x01 + 0x0004 + 0x02 + 0x01 = 0x08

  12. 2:当你发送的缓冲区号是0x02时: 校验和 = 0x09
  13. 0x01 + 0x0004 + 0x02 + 0x02 = 0x09
复制代码

包长度如何计算的?
我们可以看出来嘛 包长度这个表格是说3个。那么我看后面确实还剩3个字节。1字节的指令码+2字节的校验和 = 3字节。
结论: 包长度: 提示了后面还有多少个字节数据

应答包格式

e33fa65ef8db462fba8c4666c2007a08.png

发送完指令包给指纹模块 我们则会收到它发的应答包 可以结合上图应答包格式

  1. 1、接收到包头:        0XEF01                 (2个字节)
  2. 2、接收到芯片地址        0XFFFFFFFF        (4个字节)
  3. 3、接收到包标识:        0X07                (1个字节)
  4. 4、接收到包长度:        0X0003                (2个字节)
  5. 5、接收到确认码:        xxH                        (1个字节)
  6. 6、接收到校验和:        SUM                        (2个字节)

  7. xxH(确认码):
  8. 00H:                生成特征成功
  9. 01H:                收包有误
  10. 06H:                指纹太乱
  11. 07H:                特征点太少
  12. 15H:                没有图像生成

  13. SUM(校验和)
复制代码

3.比对特征-PS_Match
  1. 功能:                 将CharBuffer1 和 CharBuffer2 的特征文件比对。
  2. 参数:                  无
  3. 返回:                  确认字,对比得分
  4. 指令代码:         03H
复制代码

简述:
首先我们通过指令码包给AS608指纹模块让它对比然后CharBuffer1 和 CharBuffer2 的特征文件,指纹模块会返回应答包给我们。我们通过应答包的确认字去判断这次的结果。

指令包格式:

b5ad9c851fd4407dab6dd74950f20a40.png

首先我们是我们给指纹模块发送的内容 可以结合上图指令包格式

  1. 1、发送包头:                0XEF01                 (2个字节)
  2. 2、发送芯片地址:        0XFFFFFFFF        (4个字节)
  3. 3、发送包标识:        0X01                (1个字节)
  4. 4、发送包长度:        0X0003                (2个字节)
  5. 5、发送指令码:        0X03                (1个字节)
  6. 6、发送校验和:        0X07                (2个字节)
复制代码

应答包格式

e35fcadae7d3491a9ca11cb9c007cba4.png

发送完指令包给指纹模块 我们则会收到它发的应答包 可以结合上图应答包格式

  1. 1、接收到包头:        0XEF01                 (2个字节)
  2. 2、接收到芯片地址        0XFFFFFFFF        (4个字节)
  3. 3、接收到包标识:        0X07                (1个字节)
  4. 4、接收到包长度:        0X0003                (2个字节)
  5. 5、接收到确认码:        xxH                        (1个字节)
  6. 6、接收到校验和:        SUM                        (2个字节)

  7. xxH(确认码):
  8. 00H:                指纹匹配成功
  9. 01H:                收包有误
  10. 08H:                指纹不匹配

  11. SUM(校验和)
复制代码

4.生成模板-PS_RegModel
  1. 功能:                 将CharBuffer1 和 CharBuffer2 的特征文件合并生成模板,结果存放在CharBuffer1 与 CharBuffer2
  2. 参数:                  无
  3. 返回:                  确认字
  4. 指令代码:         05H
复制代码

简述:
首先我们通过指令码包给AS608指纹模块让它将CharBuffer1 和 CharBuffer2 的特征文件合并生成模板,指纹模块会返回应答包给我们。我们通过应答包的确认字去判断这次的结果。

指令包格式:

61780abf4b874eb1bdeca7d7b2ac4193.png

首先我们是我们给指纹模块发送的内容 可以结合上图指令包格式
  1. 1、发送包头:                0XEF01                 (2个字节)
  2. 2、发送芯片地址:        0XFFFFFFFF        (4个字节)
  3. 3、发送包标识:        0X01                (1个字节)
  4. 4、发送包长度:        0X0003                (2个字节)
  5. 5、发送指令码:        0X05                (1个字节)
  6. 6、发送校验和:        0X09                (2个字节)
复制代码

应答包格式



发送完指令包给指纹模块 我们则会收到它发的应答包 可以结合上图应答包格式

  1. 1、接收到包头:        0XEF01                 (2个字节)
  2. 2、接收到芯片地址        0XFFFFFFFF        (4个字节)
  3. 3、接收到包标识:        0X07                (1个字节)
  4. 4、接收到包长度:        0X0003                (2个字节)
  5. 5、接收到确认码:        xxH                        (1个字节)
  6. 6、接收到校验和:        SUM                        (2个字节)

  7. xxH(确认码):
  8. 00H:                合并成功
  9. 01H:                收包有误
  10. 0AH:                合并失败(不是同一个手指)

  11. SUM(校验和)
复制代码

5.储存模板-PS_StoreChar
  1. 功能:                 将CharBuffer1 和 CharBuffer2 的模板文件,存放到PageID号flash数据库位置
  2. 参数:                  BufferID(缓冲区号 0x01/0x02),PageID(指纹库位置号)
  3. 返回:                  确认字
  4. 指令代码:         06H
复制代码

简述:
首先我们通过指令码包给AS608指纹模块让它将CharBuffer1 和 CharBuffer2 生成的模板进行储存模板,指纹模块会返回应答包给我们。我们通过应答包的确认字去判断这次的结果。


指令包格式:

3a6d50800efc41fea02dc35cf2aeeaa6.png

首先我们是我们给指纹模块发送的内容 可以结合上图指令包格式

  1. 1、发送包头:                0XEF01                 (2个字节)
  2. 2、发送芯片地址:        0XFFFFFFFF        (4个字节)
  3. 3、发送包标识:        0X01                (1个字节)
  4. 4、发送包长度:        0X0006                (2个字节)
  5. 5、发送指令码:        0X06                (1个字节)
  6. 6、发送缓冲区号:        BufferID        (1个字节)
  7. 7、发送位置号:        PageID                (2个字节)
  8. 7、发送校验和:        SUM                        (2个字节)

  9. SUM(校验和) = 包标识+包长度+指令码+BufferID+PageID;
  10. SUM(校验和) = 0X01+0X06+0X06+BufferID+PageID;
复制代码

应答包格式



发送完指令包给指纹模块 我们则会收到它发的应答包 可以结合上图应答包格式

  1. 1、接收到包头:        0XEF01                 (2个字节)
  2. 2、接收到芯片地址        0XFFFFFFFF        (4个字节)
  3. 3、接收到包标识:        0X07                (1个字节)
  4. 4、接收到包长度:        0X0003                (2个字节)
  5. 5、接收到确认码:        xxH                        (1个字节)
  6. 6、接收到校验和:        SUM                        (2个字节)

  7. xxH(确认码):
  8. 00H:                储存模板成功
  9. 01H:                收包有误
  10. 0BH:                PageID超出指纹库范围
  11. 18H:                写FLASH出错

  12. SUM(校验和)
复制代码

你都看到这里了,那么你添加指纹的操作就可以完成了。

6.删除模板-PS_DeletChar
  1. 功能:                 删除flash数据库中指定ID号开始的N个指纹模板。
  2. 参数:                  PageID(指纹库模板号),N(删除的模板个数)
  3. 返回:                  确认字
  4. 指令代码:         0CH
复制代码

简述:
首先我们通过指令码包给AS608指纹模块让它删除模板,指纹模块会返回应答包给我们。我们通过应答包的确认字去判断这次的结果。


指令包格式:

8673a060ced4492fa20c989a77c88eec.png

首先我们是我们给指纹模块发送的内容 可以结合上图指令包格式

  1. 1、发送包头:                0XEF01                 (2个字节)
  2. 2、发送芯片地址:        0XFFFFFFFF        (4个字节)
  3. 3、发送包标识:        0X01                (1个字节)
  4. 4、发送包长度:        0X0007                (2个字节)
  5. 5、发送指令码:        0X0C                (1个字节)
  6. 6、发送位置号:        PageID                (2个字节)
  7. 7、发送删除个数:        N                        (2个字节)
  8. 7、发送校验和:        SUM                        (2个字节)

  9. SUM(校验和) = 包标识+包长度+指令码+PageID+N;
  10. SUM(校验和) = 0X01+0X07+0X0C+PageID+N;
复制代码

应答包格式



发送完指令包给指纹模块 我们则会收到它发的应答包 可以结合上图应答包格式

  1. 1、接收到包头:        0XEF01                 (2个字节)
  2. 2、接收到芯片地址        0XFFFFFFFF        (4个字节)
  3. 3、接收到包标识:        0X07                (1个字节)
  4. 4、接收到包长度:        0X0003                (2个字节)
  5. 5、接收到确认码:        xxH                        (1个字节)
  6. 6、接收到校验和:        SUM                        (2个字节)

  7. xxH(确认码):
  8. 00H:                删除模板成功
  9. 01H:                收包有误
  10. 10H:                删除模板失败

  11. SUM(校验和)
复制代码

7.清空指纹库-PS_Empty
  1. 功能:                 删除flash数据库所有指纹模板
  2. 参数:                  无
  3. 返回:                  确认字
  4. 指令代码:         0DH
复制代码

简述:
首先我们通过指令码包给AS608指纹模块让它清空所有模板,指纹模块会返回应答包给我们。我们通过应答包的确认字去判断这次的结果。

指令包格式:

edf4eebf3c4a4cfe95d1056586a412d8.png

首先我们是我们给指纹模块发送的内容 可以结合上图指令包格式

  1. 1、发送包头:                0XEF01                 (2个字节)
  2. 2、发送芯片地址:        0XFFFFFFFF        (4个字节)
  3. 3、发送包标识:        0X01                (1个字节)
  4. 4、发送包长度:        0X0003                (2个字节)
  5. 5、发送指令码:        0X0D                (1个字节)
  6. 6、发送校验和:        0X0011                (2个字节)
复制代码

应答包格式

4df797c542ae42868b78f82485795089.png

发送完指令包给指纹模块 我们则会收到它发的应答包 可以结合上图应答包格式

  1. 1、接收到包头:        0XEF01                 (2个字节)
  2. 2、接收到芯片地址        0XFFFFFFFF        (4个字节)
  3. 3、接收到包标识:        0X07                (1个字节)
  4. 4、接收到包长度:        0X0003                (2个字节)
  5. 5、接收到确认码:        xxH                        (1个字节)
  6. 6、接收到校验和:        SUM                        (2个字节)

  7. xxH(确认码):
  8. 00H:                清空所有成功
  9. 01H:                收包有误
  10. 10H:                清空所有失败

  11. SUM(校验和)
复制代码

你都看到这里了,那么你删除指纹的操作就可以完成了。

8.高速搜索指纹-PS_HighSpeedSearch

  1. 功能:                 以CharBuffer1 或 CharBuffer2中的特征文件高速搜索整个或部分指纹库。如果搜索到,返回页码。
  2. 参数:                  BufferID(0x01/0x02),StartPage(起始页),PageNum(页数)
  3. 返回:                  确认字,页码(匹配的指纹模板)
  4. 指令代码:         1BH
复制代码

简述:
首先我们通过指令码包给AS608指纹模块让它高速搜索是否和咱这个指纹一样,指纹模块会返回应答包给我们。我们通过应答包的确认字去判断这次的结果。

指令包格式:

ba7e59803f4c4b0686c43d8e2548ec4d.png

首先我们是我们给指纹模块发送的内容 可以结合上图指令包格式

  1. 1、发送包头:                0XEF01                 (2个字节)
  2. 2、发送芯片地址:        0XFFFFFFFF        (4个字节)
  3. 3、发送包标识:        0X01                (1个字节)
  4. 4、发送包长度:        0X0008                (2个字节)
  5. 5、发送指令码:        0X1B                (1个字节)
  6. 6、发送缓冲区号:        BufferID        (1个字节)
  7. 7、发送起始页:        StartPage        (2个字节)
  8. 7、发送页数:                PageNum                (2个字节)
  9. 7、发送校验和:        SUM                        (2个字节)

  10. StartPage(起始页):开始搜索的页码
  11. PageNum(页数):         搜索多少页

  12. SUM(校验和) = 包标识+包长度+指令码+BufferID+StartPage+PageNum;
  13. SUM(校验和) = 0x01+0x08+0x1B+BufferID+StartPage+PageNum;
复制代码

应答包格式

eadbc238ae06432aaa4362f0e4b48244.png

发送完指令包给指纹模块 我们则会收到它发的应答包 可以结合上图应答包格式

  1. 1、接收到包头:        0XEF01                 (2个字节)
  2. 2、接收到芯片地址        0XFFFFFFFF        (4个字节)
  3. 3、接收到包标识:        0X07                (1个字节)
  4. 4、接收到包长度:        0X0007                (2个字节)
  5. 5、接收到确认码:        xxH                        (1个字节)
  6. 6、接收到页码:        PageID                (2个字节)
  7. 7、接收到得分:        MatchScore        (2个字节)
  8. 8、接收到校验和:        SUM                        (2个字节)

  9. xxH(确认码):
  10. 00H:                搜索到
  11. 01H:                收包有误
  12. 09H:                没有搜索到 页码和得分也会是 0

  13. SUM(校验和)
复制代码

9.搜索指纹-PS_Search
  1. 功能:                 以CharBuffer1 或 CharBuffer2中的特征文件搜索整个或部分指纹库。如果搜索到,返回页码。
  2. 参数:                  BufferID(0x01/0x02),StartPage(起始页),PageNum(页数)
  3. 返回:                  确认字,页码(匹配的指纹模板)
  4. 指令代码:         04H
复制代码

简述:
首先我们通过指令码包给AS608指纹模块让它搜索是否和咱这个指纹一样,指纹模块会返回应答包给我们。我们通过应答包的确认字去判断这次的结果。

指令包格式:

ee429214c58047fcaa6575e59506c9fc.png

首先我们是我们给指纹模块发送的内容 可以结合上图指令包格式

  1. 1、发送包头:                0XEF01                 (2个字节)
  2. 2、发送芯片地址:        0XFFFFFFFF        (4个字节)
  3. 3、发送包标识:        0X01                (1个字节)
  4. 4、发送包长度:        0X0008                (2个字节)
  5. 5、发送指令码:        0X04                (1个字节)
  6. 6、发送缓冲区号:        BufferID        (1个字节)
  7. 7、发送起始页:        StartPage        (2个字节)
  8. 7、发送页数:                PageNum                (2个字节)
  9. 7、发送校验和:        SUM                        (2个字节)

  10. StartPage(起始页):开始搜索的页码
  11. PageNum(页数):         搜索多少页

  12. SUM(校验和) = 包标识+包长度+指令码+BufferID+StartPage+PageNum;
  13. SUM(校验和) = 0x01+0x08+0x04+BufferID+StartPage+PageNum;
复制代码

应答包格式

073488bb5d4c41ac8fd1ef7cd1aded0f.png

发送完指令包给指纹模块 我们则会收到它发的应答包 可以结合上图应答包格式

  1. 1、接收到包头:        0XEF01                 (2个字节)
  2. 2、接收到芯片地址        0XFFFFFFFF        (4个字节)
  3. 3、接收到包标识:        0X07                (1个字节)
  4. 4、接收到包长度:        0X0007                (2个字节)
  5. 5、接收到确认码:        xxH                        (1个字节)
  6. 6、接收到页码:        PageID                (2个字节)
  7. 7、接收到得分:        MatchScore        (2个字节)
  8. 8、接收到校验和:        SUM                        (2个字节)

  9. xxH(确认码):
  10. 00H:                搜索到
  11. 01H:                收包有误
  12. 09H:                没有搜索到 页码和得分也会是 0

  13. SUM(校验和)
复制代码

这两个都是搜索。。一个高速一个不是 我估计就是高速更快,但是估计没不高速那个那么精确吧。个人感觉。
你都看到这里了,那么你验证指纹的操作就可以完成了。

10.查有效模板个数-PS_ValidTempleteNum
  1. 功能:                 读取有效模板个数(查询当前一共有多少个指纹)
  2. 参数:                  无
  3. 返回:                  确认字,有效模板个数ValidN
  4. 指令代码:         1DH
复制代码

简述:
首先我们通过指令码包给AS608指纹模块让它清空所有模板,指纹模块会返回应答包给我们。我们通过应答包的确认字去判断这次的结果。

指令包格式:



首先我们是我们给指纹模块发送的内容 可以结合上图指令包格式

  1. 1、发送包头:                0XEF01                 (2个字节)
  2. 2、发送芯片地址:        0XFFFFFFFF        (4个字节)
  3. 3、发送包标识:        0X01                (1个字节)
  4. 4、发送包长度:        0X0003                (2个字节)
  5. 5、发送指令码:        0X1D                (1个字节)
  6. 6、发送校验和:        0X0021                (2个字节)
复制代码

应答包格式

17e6593bcc9e4e8a9fab22a24c0a9ef2.png
发送完指令包给指纹模块 我们则会收到它发的应答包 可以结合上图应答包格式

  1. 1、接收到包头:        0XEF01                 (2个字节)
  2. 2、接收到芯片地址        0XFFFFFFFF        (4个字节)
  3. 3、接收到包标识:        0X07                (1个字节)
  4. 4、接收到包长度:        0X0005                (2个字节)
  5. 5、接收到确认码:        xxH                        (1个字节)
  6. 6、接收到模板数:        ValidN                (2个字节)
  7. 7、接收到校验和:        SUM                        (2个字节)

  8. xxH(确认码):
  9. 00H:                读取成功
  10. 01H:                收包有误

  11. SUM(校验和)
复制代码

你都看到这里了,那么你查询当前有多少个指纹就可以完成了。

11.关于包长度和校验和
指令包格式:



包长度如何计算的?
我们可以看出来嘛 包长度这个表格是说3个。那么我看后面确实还剩3个字节。1字节的指令码+2字节的校验和 = 3字节。
结论: 包长度: 提示了后面还有多少个字节数据

校验和如何计算的?

我们同样也可以看出来 它的校验和是说是5。那么我们很容易发现,校验和其实是 从 包标识 0x01 + 包长度 0x0003 + 指令码 0x01 = 5。
结论: 校验和 = 包标识开始 + … 到校验和 但不含校验和。

三: 编写指令集代码
0.预代码
看到这里了你也知道了发送指令包其实很多都是一样的,比如发送包头,发送芯片地址…等。我们现在打包成一个个函数。这样方便我们后面编写各个功能指令函数。
预定义:

  1. #define                CharBuffer1                0x01
  2. #define                CharBuffer2                0x02
  3. uint16_t AS608_HEAD = 0XEF01;                        //包头
  4. uint32_t AS608_ADDR        = 0XFFFFFFFF;                //芯片地址
复制代码

然后下面就是一些打包的函数

  1. /***************************************************************************
  2. 描述: 发送包头
  3. ****************************************************************************/
  4. static void as608_send_head(void)
  5. {
  6.         USART2_SendData(AS608_HEAD>>8);
  7.         USART2_SendData(AS608_HEAD);
  8. }

  9. /***************************************************************************
  10. 描述: 发送芯片地址
  11. ****************************************************************************/
  12. static void as608_send_address(void)
  13. {
  14.         USART2_SendData(AS608_ADDR>>24);
  15.         USART2_SendData(AS608_ADDR>>16);
  16.         USART2_SendData(AS608_ADDR>>8);
  17.         USART2_SendData(AS608_ADDR);
  18. }

  19. /***************************************************************************
  20. 描述: 发送包标识
  21. ****************************************************************************/
  22. static void as608_send_logo(uint8_t logo)
  23. {
  24.         USART2_SendData(logo);
  25. }

  26. /***************************************************************************
  27. 描述: 发送包长度
  28. ****************************************************************************/
  29. static void as608_send_length(uint16_t length)
  30. {
  31.         USART2_SendData(length>>8);
  32.         USART2_SendData(length);
  33. }

  34. /***************************************************************************
  35. 描述: 发送指令码
  36. ****************************************************************************/
  37. static void as608_send_cmd(uint8_t cmd)
  38. {
  39.         USART2_SendData(cmd);
  40. }


  41. /***************************************************************************
  42. 描述: 发送校验和
  43. ****************************************************************************/
  44. static void as608_send_checksum(uint16_t checksum)
  45. {
  46.         USART2_SendData(checksum>>8);
  47.         USART2_SendData(checksum);
  48. }

  49. /***************************************************************************
  50. 描述: 发送BufferID
  51. ****************************************************************************/
  52. static void as608_send_BufferID(uint8_t BufferID)
  53. {
  54.         USART2_SendData(BufferID);
  55. }

  56. /***************************************************************************
  57. 描述: 发送StartPage
  58. ****************************************************************************/
  59. static void as608_send_StartPage(uint16_t StartPage)
  60. {
  61.         USART2_SendData(StartPage>>8);
  62.         USART2_SendData(StartPage);
  63. }

  64. /***************************************************************************
  65. 描述: 发送PageNum
  66. ****************************************************************************/
  67. static void as608_send_PageNum(uint16_t PageNum)
  68. {
  69.         USART2_SendData(PageNum>>8);
  70.         USART2_SendData(PageNum);
  71. }

  72. /***************************************************************************
  73. 描述: 发送PageID号
  74. ****************************************************************************/
  75. static void as608_send_PageID(uint16_t PageID)
  76. {
  77.         USART2_SendData(PageID>>8);
  78.         USART2_SendData(PageID);
  79. }

  80. /***************************************************************************
  81. 描述: 发送个数
  82. ****************************************************************************/
  83. static void as608_send_N(uint16_t N)
  84. {
  85.         USART2_SendData(N>>8);
  86.         USART2_SendData(N);
  87. }
复制代码

好了封装了一下 这下子就方便多了

1.读取图像-PS_GetImage
  1. /***************************************************************************
  2. 描述: 获取手指指纹图像 存放于图像缓冲区
  3. 参数: 无                                         指令代码:02H
  4. 返回: 00H: 录入指纹成功                01H:收包错误        02H:无手指        03H:录入不成功
  5. ****************************************************************************/
  6. uint8_t PS_GetImage(void)
  7. {        
  8.         uint8_t result;                                //存放结果

  9.         CLEAR_BUFFER;                                //清空缓冲区
  10.         
  11.         as608_send_head();                        //发送包头
  12.         as608_send_address();                //发送芯片地址
  13.         as608_send_logo(0x01);                //发送包标识
  14.         as608_send_length(0x03);        //发送包长度
  15.         as608_send_cmd(0x01);                //发送指令码
  16.         as608_send_checksum(0x05);        //发送校验和
  17.         OPEN_USART2_RECEIVE;                //开启串口接收

  18.         result = as608_detection_data(300,NULL);        //检测指纹模块数据 3秒时间
  19.         if(result == 0XFF)        result = 0x01;        

  20.         return result;
  21. }
复制代码

2.生成特征-PS_GenChar
  1. /***************************************************************************
  2. 描述: 生成特征
  3. 参数: BufferID(特征缓冲区号) 指令代码:02H
  4.           CharBuffer1 的 BufferID: 01H  CharBuffer2的 BufferID: 02H
  5. 返回: 00H: 生成特征成功                01H:收包错误        06H:指纹图像太乱生成失败
  6.           07H: 特征太少                        15H:图像缓冲区没图像
  7. ****************************************************************************/
  8. uint8_t PS_GenChar(uint8_t BufferID)
  9. {
  10.         uint16_t checksum;                                //存放校验和
  11.         uint8_t result;                                        //存放结果

  12.         CLEAR_BUFFER;                                        //清空缓冲区
  13.         as608_send_head();                                //发送包头
  14.         as608_send_address();                        //发送芯片地址
  15.         as608_send_logo(0x01);                        //发送包标识
  16.         as608_send_length(0x04);                //发送包长度
  17.         as608_send_cmd(0x02);                        //发送指令码
  18.         as608_send_BufferID(BufferID);        //发送BufferID
  19.         checksum = 0x01 + 0x04 + 0x02 + BufferID;        
  20.         as608_send_checksum(checksum);        //发送校验和
  21.         OPEN_USART2_RECEIVE;                        //开启串口接收        

  22.         result = as608_detection_data(300,NULL);        //检测指纹模块数据 3秒时间
  23.         if(result == 0XFF)        result = 0x01;        

  24.         return result;
  25. }
复制代码

3.比对特征-PS_Match
  1. /***************************************************************************
  2. 描述: 精确比对两枚指纹特征
  3. 参数: 无                                        指令代码:03H
  4. 返回: 00H: 指纹匹配成功                08H:指纹不匹配                01H:收包错误
  5. ****************************************************************************/
  6. uint8_t PS_Match(void)
  7. {
  8.         uint8_t result;                                        //存放结果
  9.         
  10.         CLEAR_BUFFER;                                        //清空缓冲区
  11.         as608_send_head();                                //发送包头
  12.         as608_send_address();                        //发送芯片地址
  13.         as608_send_logo(0x01);                        //发送包标识
  14.         as608_send_length(0x03);                //发送包长度
  15.         as608_send_cmd(0x03);                        //发送指令码
  16.         as608_send_checksum(0x07);                //发送校验和
  17.         OPEN_USART2_RECEIVE;                        //开启串口接收

  18.         result = as608_detection_data(300,NULL);        //检测指纹模块数据 3秒时间
  19.         if(result == 0XFF)        result = 0x01;        

  20.         return result;
  21. }
复制代码

4.生成模板-PS_RegModel
  1. /***************************************************************************
  2. 描述: 合并特征 将CharBuffer1 和 CharBuffer2 中的 特征合并生成模板
  3.           结果存在CharBuffer1 和 CharBuffer2        
  4. 参数: 无                                指令代码:05H
  5. 返回: 00H: 合并成功                01H:收包错误        0AH:合并失败(两枚手指不是同一个)
  6. ****************************************************************************/
  7. uint8_t PS_RegModel(void)
  8. {
  9.         uint8_t result;                                        //存放结果

  10.         CLEAR_BUFFER;                                        //清空缓冲区
  11.         as608_send_head();                                //发送包头
  12.         as608_send_address();                        //发送芯片地址
  13.         as608_send_logo(0x01);                        //发送包标识
  14.         as608_send_length(0x03);                //发送包长度
  15.         as608_send_cmd(0x05);                        //发送指令码
  16.         as608_send_checksum(0x09);                //发送校验和
  17.         OPEN_USART2_RECEIVE;                        //开启串口接收

  18.         result = as608_detection_data(300,NULL);        //检测指纹模块数据 3秒时间
  19.         if(result == 0XFF)        result = 0x01;        

  20.         return result;               
  21. }
复制代码

5.储存模板-PS_StoreChar
  1. /***************************************************************************
  2. 描述: 储存模板 将CharBuffer1和CharBuffer2的模板文件存到PageID号Flash数据库位置
  3. 参数: BufferID:        01H/02H                PageID:指纹库位置号                指令代码:06H
  4. 返回: 00H: 储存成功        01H:收包错误 0BH:PageID超出指纹库范围 18H:写Flash出错
  5. ****************************************************************************/
  6. uint8_t PS_StoreChar(uint8_t BufferID,uint16_t PageID)
  7. {
  8.         uint16_t checksum;                                //存放校验和
  9.         uint8_t result;                                        //存放结果

  10.         CLEAR_BUFFER;                                        //清空缓冲区
  11.         as608_send_head();                                //发送包头
  12.         as608_send_address();                        //发送芯片地址
  13.         as608_send_logo(0x01);                        //发送包标识
  14.         as608_send_length(0x06);                //发送包长度
  15.         as608_send_cmd(0x06);                        //发送指令码
  16.         as608_send_BufferID(BufferID);        //发送BufferID
  17.         as608_send_PageID(PageID);                //发送指纹库位置号        
  18.         checksum = 0x01+0x06+0x06+BufferID+PageID;
  19.         as608_send_checksum(checksum);        //发送校验和
  20.         OPEN_USART2_RECEIVE;                        //开启串口接收        

  21.         result = as608_detection_data(300,0);        //检测指纹模块数据 3秒时间
  22.         if(result == 0XFF)        result = 0x01;        

  23.         return result;               
  24. }
复制代码

6.删除模板-PS_DeletChar
  1. /***************************************************************************
  2. 描述: 删除模板  删除Flash数据库中指定的ID号开始的N个指纹模板
  3. 参数: PageID:指纹库模板号 N:删除的模板个数                指令代码:0CH
  4. 返回: 00H: 删除模板成功                01H:收包错误         10H:删除模板失败
  5. ****************************************************************************/
  6. uint8_t PS_DeletChar(uint16_t PageID,uint16_t N)
  7. {
  8.         uint16_t checksum;                                //存放校验和
  9.         uint8_t result;                                        //存放结果

  10.         CLEAR_BUFFER;                                        //清空缓冲区
  11.         as608_send_head();                                //发送包头
  12.         as608_send_address();                        //发送芯片地址
  13.         as608_send_logo(0x01);                        //发送包标识
  14.         as608_send_length(0x07);                //发送包长度
  15.         as608_send_cmd(0x0C);                        //发送指令码
  16.         as608_send_PageID(PageID);                //发送指纹库位置号
  17.         as608_send_N(N);                                //发送删除模板的个数
  18.         
  19.         checksum = 0x01+0x07+0x0C+PageID+N;
  20.         as608_send_checksum(checksum);                //发送校验和
  21.         OPEN_USART2_RECEIVE;                        //开启串口接收        

  22.         result = as608_detection_data(300,NULL);        //检测指纹模块数据 3秒时间
  23.         if(result == 0XFF)        result = 0x01;        

  24.         return result;                        
  25. }
复制代码

7.清空指纹库-PS_Empty
  1. /***************************************************************************
  2. 描述: 清空Flash数据库中所有指纹模板
  3. 参数: 无                                指令代码:0DH
  4. 返回: 00H: 清空成功        01H:收包错误         11H:清空失败
  5. ****************************************************************************/
  6. uint8_t PS_Empty(void)
  7. {
  8.         uint8_t result;                                        //存放结果

  9.         CLEAR_BUFFER;                                        //清空缓冲区
  10.         as608_send_head();                                //发送包头
  11.         as608_send_address();                        //发送芯片地址
  12.         as608_send_logo(0x01);                        //发送包标识
  13.         as608_send_length(0x03);                //发送包长度
  14.         as608_send_cmd(0x0D);                        //发送指令码
  15.         as608_send_checksum(0X11);                //发送校验和
  16.         OPEN_USART2_RECEIVE;                        //开启串口接收        

  17.         result = as608_detection_data(300,NULL);        //检测指纹模块数据 3秒时间
  18.         if(result == 0XFF)        result = 0x01;        

  19.         return result;                        
  20. }
复制代码

8.高速搜索指纹-PS_HighSpeedSearch
  1. /***************************************************************************
  2. 描述: 高速搜索 以CharBuffer1或CharBuffer2的特征文件高速搜索整个或者部分指纹库
  3. 参数: BufferID:        01H/02H          StartPage:起始页         PageNum:页数        指令代码:1BH
  4.       ID: 存放搜索到的指纹ID号 否则为0
  5. 返回: 确认字00H: 搜索到        01H:收包错误 09H:没有搜索到(页码就是0) 和 对应页码
  6. ****************************************************************************/
  7. uint8_t PS_HighSpeedSearch(uint8_t BufferID,uint16_t StartPage,uint16_t PageNum,uint16_t *ID)
  8. {
  9.         uint16_t checksum;                                //存放校验和
  10.         uint8_t result;                                        //存放结果

  11.         CLEAR_BUFFER;                                        //清空缓冲区
  12.         as608_send_head();                                //发送包头
  13.         as608_send_address();                        //发送芯片地址
  14.         as608_send_logo(0x01);                        //发送包标识
  15.         as608_send_length(0x08);                //发送包长度
  16.         as608_send_cmd(0x1B);                        //发送指令码
  17.         as608_send_BufferID(BufferID);        //发送BufferID
  18.         as608_send_StartPage(StartPage);//发送起始页
  19.         as608_send_PageNum(PageNum);        //发送页数        
  20.         checksum = 0x01+0x08+0x1B+BufferID+StartPage+PageNum;
  21.         as608_send_checksum(checksum);        //发送校验和
  22.         OPEN_USART2_RECEIVE;                        //开启串口接收        

  23.         result = as608_detection_data(300,&ID);        //检测指纹模块数据 3秒时间
  24.         if(result == 0XFF)        result = 0x01;        

  25.         return result;                        
  26. }
复制代码

9.搜索指纹-PS_Search
  1. /***************************************************************************
  2. 描述: 搜索指纹                                                                 指令代码:04H
  3. 参数: BufferID:        01H/02H         StartPage:起始页        PageNum:页数
  4.           ID: 存放搜索到的指纹ID号 否则为0
  5. 返回: 00H: 搜索到        09H:没有搜索到                 01H:收包错误
  6. ****************************************************************************/
  7. uint8_t PS_Search(uint8_t BufferID,uint16_t StartPage,uint16_t PageNum,uint16_t *ID)
  8. {
  9.         uint16_t checksum;                                //存放校验和
  10.         uint8_t result;                                        //存放结果
  11.         
  12.         CLEAR_BUFFER;                                        //清空缓冲区
  13.         as608_send_head();                                //发送包头
  14.         as608_send_address();                        //发送芯片地址
  15.         as608_send_logo(0x01);                        //发送包标识
  16.         as608_send_length(0x08);                //发送包长度
  17.         as608_send_cmd(0x04);                        //发送指令码
  18.         as608_send_BufferID(BufferID);        //发送BufferID
  19.         as608_send_StartPage(StartPage);//发送起始页
  20.         as608_send_PageNum(PageNum);        //发送页数
  21.         checksum = 0x01+0x08+0x04+BufferID+StartPage+PageNum;
  22.         as608_send_checksum(checksum);        //发送校验和
  23.         OPEN_USART2_RECEIVE;                        //开启串口接收               
  24.         
  25.         result = as608_detection_data(300,&ID);        //检测指纹模块数据 3秒时间
  26.         if(result == 0XFF)        result = 0x01;        

  27.         return result;        
  28. }
复制代码

10.查有效模板个数-PS_ValidTempleteNum
  1. /***************************************************************************
  2. 描述: 读取模板个数
  3. 参数: NUM:个数会保存在NUM中                        指令代码:1DH
  4. 返回: 00H: 注册成功        01H:收包错误         NUM也会返回
  5. ****************************************************************************/
  6. uint8_t PS_ValidTempleteNum(uint16_t *NUM)
  7. {
  8.         uint8_t result;                                        //存放结果

  9.         CLEAR_BUFFER;                                        //清空缓冲区
  10.         as608_send_head();                                //发送包头
  11.         as608_send_address();                        //发送芯片地址
  12.         as608_send_logo(0x01);                        //发送包标识
  13.         as608_send_length(0x03);                //发送包长度
  14.         as608_send_cmd(0x1D);                        //发送指令码
  15.         as608_send_checksum(0X21);                //发送校验和
  16.         OPEN_USART2_RECEIVE;                        //开启串口接收        

  17.         result = as608_detection_data(300,&NUM);        //检测指纹模块数据 3秒时间
  18.         if(result == 0XFF)        result = 0x01;        

  19.         return result;                        
  20. }
复制代码

三: 指纹代码编写
0.接收处理
我思路是这样的 返回的指令包都有一个固定的格式的,我们通过是否和这个固定的格式匹配,如果匹配再进行下一步,为了数据准确性,我这里还校验一下这个校验和,如果是找到这个数据格式头,但是校验和是错的,那数据也是有问题的。

  1. 第一步:匹配固定数据格式
  2. 第二步:校验和验证
  3. 第三步:返回确认码(如果有ID,或者模板个数,则需要传变量过去进行存放)
复制代码

匹配固定数据格式

  1. /***************************************************************************
  2. 描述: 检测串口返回的数据
  3. 参数: wait_time:等待的时间 一次:10ms        
  4. ID_OR_NUM: 如果不是搜索指令或者查找模板个数设置为NULL 否则存放ID号或者NUM个数        
  5. 返回: 无效数据返回0XFF  否则返回结果
  6. ****************************************************************************/
  7. uint8_t as608_detection_data(uint16_t wait_time,uint16_t **ID_OR_NUM)
  8. {
  9.         char *data;
  10.         uint8_t result = 0XFF;        //存放结果

  11.         while(wait_time--)
  12.         {        
  13.                 delay_ms(10);
  14.                 //匹配数据帧头
  15.                 data = strstr((char *)as608_receive_data,(char *)check_head);
  16.                 if(data != NULL)
  17.                 {
  18.                         result = as608_detection_checknum(data,&*ID_OR_NUM);        
  19.                         break;
  20.                 }        
  21.         }
  22.         CLOSE_USART2_RECEIVE;                        //禁止串口接收
  23.         return result;        
  24. }
复制代码

验证校验和是否准确

  1. /***************************************************************************
  2. 描述: 校验数据是否正确
  3. 参数: data:数据包               
  4. ID_OR_NUM: 如果不是搜索指令或者查找模板个数设置为NULL 否则存放ID号或者NUM个数        
  5. 返回: 数据错误返回0XFF   否则 返回接收结果
  6. ****************************************************************************/
  7. uint8_t as608_detection_checknum(char *data , uint16_t **ID_OR_NUM)
  8. {
  9.         //包标识位置:6        包长度位置:7、8
  10.         uint8_t packet_length;        //包长度
  11.         uint8_t checksum1 = 0;                //数据包校验和
  12.         uint8_t checksum2 = 0;                //计算出的校验和
  13.         uint8_t i;

  14.         packet_length = (data[7]*10) + data[8];        //获取数据包长度
  15.         if(packet_length == 0) return 0XFF;                //如果无长度 返回错误
  16.         
  17.         checksum1 = (data[6+packet_length+1]*10) + data[6+packet_length+2];        //数据包校验和

  18.         //自己校验的校验和
  19.         for(i=0;i<packet_length+1;i++)
  20.         {
  21.                 checksum2 += data[i+6];
  22.         }
  23.         //匹配校验和是否准确
  24.         if(checksum1 == checksum2)
  25.         {
  26.                 //如果是搜索指令 ID进行保存 如果是查找模板个数 NUM进行保存
  27.                 if(*ID_OR_NUM != NULL)
  28.                         **ID_OR_NUM = (data[10]*10) + data[11];        //获取指纹ID号/模板个数
  29.         
  30.                 printf("数据校验和匹配 数据位:%#X\r\n",data[9]);
  31.                 return data[9];                //返回结果
  32.                
  33.         }
  34.         printf("数据校验和错误\r\n");
  35.         return 0XFF;
  36. }
复制代码
检测手指是否在

  1. /***************************************************************************
  2. 描述: 检测手指是否在模块中
  3. 参数: wait_time:等待的时间 一次:10ms
  4. 返回: 0:手指在         1:不在
  5. ****************************************************************************/
  6. uint8_t as608_detection_finger(uint16_t wait_time)
  7. {
  8.         finger_status = FINGER_NO_EXIST;
  9.         //检测手指是否在模块中
  10.         while(wait_time--)
  11.         {
  12.                 delay_ms(10);
  13.                 if(finger_status == FINGER_EXIST)
  14.                 {
  15.                         finger_status = FINGER_NO_EXIST;
  16.                         return 0;
  17.                 }        
  18.         }
  19.         return 1;
  20. }
复制代码

1.添加指纹
首先添加指纹需要的步骤:

  1. 第一步:读取指纹图像
  2. 第二步:生成特征(存放在CharBuffer1)
  3. 第三步:再次读取指纹图像
  4. 第四步:生成特征(存放在CharBuffer2)
  5. 第五步:比对两个特征是否一样
  6. 第六步:合并特征生成模板
  7. 第七步:存储模板(我这里是CharBuffer2,以及设置存放的位置:PageID)
复制代码
  1. /***************************************************************************
  2. 描述: 添加指纹 函数
  3. 返回: 0: 录入指纹成功        1: 录入指纹失败
  4. ****************************************************************************/
  5. uint8_t as608_add_fingerprint(uint16_t PageID)
  6. {
  7.         uint8_t result;                                        //录入的结果
  8.         uint8_t add_stage = 1;                        //录入的阶段
  9.         
  10.         while(add_stage != EXIT)
  11.         {
  12.                 switch(add_stage)
  13.                 {
  14.                         //第一阶段 获取第一次指纹图像 并且生成特征图
  15.                         case 1:
  16.                                 printf("请放置手指\r\n");
  17.                                 if(as608_detection_finger(800))        return 0x02;        //等待手指按下                        
  18.                                 result = PS_GetImage();        //获取指纹图像
  19.                                 if(result) return 1;
  20.                                 result = PS_GenChar(CharBuffer1);//生成特征图        
  21.                                 if(result) return 1;
  22.                                 add_stage = 2;                //跳转到第二阶段
  23.                                 break;
  24.                         
  25.                         //第二阶段 获取第二次指纹图像 并且生成特征图
  26.                         case 2:
  27.                                 printf("请再放置手指\r\n");
  28.                                 if(as608_detection_finger(800))        return 0x02;        //等待手指按下               
  29.                                 result = PS_GetImage();        //获取指纹图像
  30.                                 if(result)        return 1;
  31.                                 result = PS_GenChar(CharBuffer2);//生成特征图
  32.                                 if(result)        return 1;
  33.                                 add_stage = 3;        //跳转到第三阶段
  34.                                 break;               

  35.                         //第三阶段 比对两枚指纹特征
  36.                         case 3:
  37.                                 result = PS_Match();//比对两枚指纹特征
  38.                                 if(result)        return 1;
  39.                                 add_stage = 4;                //跳转到第四阶段
  40.                                 break;

  41.                         //第四阶段 特征合并生成模板
  42.                         case 4:
  43.                                 result = PS_RegModel();//特征合并生成模板
  44.                                 if(result)        return 1;
  45.                                 add_stage = 5;                //跳转到第五阶段                                
  46.                                 break;

  47.                         //第五阶段 储存模板
  48.                         case 5:
  49.                                 result = PS_StoreChar(CharBuffer2,PageID);//储存模板
  50.                                 if(result)        return 1;
  51.                                 add_stage = EXIT;
  52.                                 break;
  53.                 }               
  54.         }
  55.         
  56.         return 0;
  57.         
  58. }
复制代码

2.验证指纹
首先验证指纹的步骤:

  1. 第一步:读取指纹图像
  2. 第二步:生成特征(存放在CharBuffer1)
  3. 第三步:高速搜索
复制代码
  1. /***************************************************************************
  2. 描述: 验证指纹 函数
  3. 返回: 返回ID号  如果没有该指纹则ID是0
  4. ****************************************************************************/
  5. uint16_t as608_verify_fingerprint(void)
  6. {
  7.         uint8_t result;                                //存放结果
  8.         uint8_t verify_stage = 1;        //验证的阶段
  9.         uint16_t ID = 0;                        //存放指纹的ID号

  10.         while(verify_stage != EXIT)
  11.         {
  12.                 switch(verify_stage)
  13.                 {
  14.                         //第一阶段 获取指纹图像
  15.                         case 1:
  16.                                 printf("请放置手指\r\n");                        
  17.                                 if(as608_detection_finger(800))        return 0x02;        //等待手指按下                        
  18.                                 result = PS_GetImage();        //获取指纹图像
  19.                                 if(result)        verify_stage = EXIT;
  20.                                 verify_stage = 2;
  21.                                 break;
  22.                         
  23.                         //第二阶段 生成特征图
  24.                         case 2:
  25.                                 result = PS_GenChar(CharBuffer1);//生成特征图
  26.                                 if(result)        verify_stage = EXIT;
  27.                                 verify_stage = 3;
  28.                                 break;        


  29.                         //第三阶段 高速搜索
  30.                         case 3:
  31.                                 result = PS_HighSpeedSearch(CharBuffer1,0,99,&ID);
  32.                                 if(result)        ID = 0;
  33.                                 verify_stage = EXIT;
  34.                                 break;                                
  35.                 }               
  36.         }
  37.         if(ID == 0x00)
  38.                 printf("验证指纹失败 ID:%d\r\n",ID);
  39.         else
  40.                 printf("验证指纹成功 ID:%d\r\n",ID);
  41.         return ID;
  42. }
复制代码

3.删除指纹

1.删除单个或多个
我这里只是删除一个 删除多个修改PS_DeletChar()第二参数即可
步骤:
  1. 第一步:先验证是否有这个指纹,如果没有就那删除啥是吧,直接返回就行。
  2. 第二步:把验证到的指纹ID给到删除指纹函数执行即可。
复制代码
  1. /***************************************************************************
  2. 描述: 删除指纹 函数
  3. 返回: 0: 删除指纹成功        1: 删除指纹失败
  4. ****************************************************************************/
  5. uint8_t as608_delete_fingerprint(void)
  6. {
  7.         uint8_t result;                                        //存放结果
  8.         uint16_t ID;                                        //存放ID号
  9.         
  10.         //1-识别要删除的指纹 如果没有这个指纹 则返回1
  11.         ID = as608_verify_fingerprint();
  12.         if(ID == 0X00)
  13.         {
  14.                 printf("删除指纹失败-没有该指纹\r\n");
  15.                 return 1;
  16.         }
  17.         //2-针对ID号码进行删除
  18.         result = PS_DeletChar(ID,1);                //删除指纹 ID号
  19.         if(result)
  20.                 printf("删除指纹失败 ID:%d\r\n",ID);
  21.         else
  22.                 printf("删除指纹成功 ID:%d\r\n",ID);
  23.         return 0;
  24. }
复制代码

2.删除所有
这个比较简单

  1. /***************************************************************************
  2. 描述: 清空所有指纹 函数
  3. 返回: 0: 清空所有指纹成功        1: 清空所有指纹失败
  4. ****************************************************************************/
  5. uint8_t as608_empty_all_fingerprint(void)
  6. {
  7.         uint8_t result;                //存放结果
  8.         
  9.         result = PS_Empty();        //删除所有指纹
  10.         switch(result)
  11.         {
  12.                 case 0x00:
  13.                         printf("清空所有指纹成功\r\n");
  14.                         break;
  15.                 case 0x01:
  16.                         printf("清空所有指纹失败-收包错误\r\n");
  17.                         break;
  18.                 case 0x11:
  19.                         printf("清空所有指纹失败-清空失败\r\n");
  20.                         break;        
  21.         }
  22.         if(result) result = 1;
  23.         return result;
  24. }
复制代码

4.查询指纹个数
  1. /***************************************************************************
  2. 描述: 查找 指纹个数 函数
  3. 返回: 查找到的个数
  4. ****************************************************************************/
  5. uint8_t as608_find_fingerprints_num(void)
  6. {
  7.         uint8_t result;
  8.         uint16_t NUM;                //存放指纹个数(模板个数)
  9.         result = PS_ValidTempleteNum(&NUM);
  10.         if(result)
  11.                 printf("查找指纹个数失败 NUM:%d\r\n",NUM);
  12.         else
  13.                 printf("查找指纹个数成功 NUM:%d\r\n",NUM);        
  14.         return NUM;
  15. }
复制代码

代码基本就是这些啦

四: 主程序代码
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "as608.h"

  5. uint8_t handler_flag;

  6. /**************************************************************
  7. 描述:菜单
  8. ***************************************************************/
  9. void menu(void)
  10. {
  11.         printf("=============================\r\n");
  12.         printf("\t1-添加指纹\r\n");
  13.         printf("\t2-验证指纹\r\n");
  14.         printf("\t3-删除指纹\r\n");
  15.         printf("\t4-查询指纹个数\r\n");
  16.         printf("=============================\r\n");
  17. }

  18. int  main()
  19. {
  20.         uint8_t ID = 0;
  21.         usart1_init(115200);        //串口1初始化 用于打印信息和输入信息
  22.         usart2_init(57600);                //串口2初始化 用于和指纹模块通信
  23.         as60x_wak_init();                //指纹模块初始化
  24.         printf("      --指纹模块小Demo--\r\n");
  25.         menu();
  26.         while(1)
  27.         {
  28.                
  29.                 switch(handler_flag)
  30.                 {
  31.                         //添加指纹
  32.                         case 1:
  33.                                 
  34.                         SCANF:
  35.                                 printf("\t添加指纹\r\n");
  36.                                 handler_flag = 0;
  37.                                 ID = 0;
  38.                                 printf("请输入ID号(1~9)\r\n");
  39.                                 while(ID == 0)
  40.                                 {        
  41.                                         ID = handler_flag;
  42.                                 }
  43.                                 if(ID >0 && ID < 10)                printf("ID号:%d\r\n",ID);               
  44.                                 else                                                goto SCANF;
  45.                                        
  46.                                 if(as608_add_fingerprint(ID))        printf("添加指纹失败\r\n");
  47.                                 else                                                         printf("添加指纹成功\r\n");
  48.                                 handler_flag = 0;
  49.                                 menu();
  50.                                 break;
  51.                         //验证指纹
  52.                         case 2:
  53.                                 printf("\t验证指纹\r\n");
  54.                                 as608_verify_fingerprint();
  55.                                 handler_flag = 0;
  56.                                 menu();
  57.                                 break;        
  58.                         //删除指纹
  59.                         case 3:
  60.                                 printf("\t删除指纹\r\n");
  61.                                 as608_delete_fingerprint();        
  62.                                 handler_flag = 0;        
  63.                                 menu();
  64.                                 break;                        
  65.                         //查询模板个数
  66.                         case 4:
  67.                                 printf("\t查看指纹个数\r\n");
  68.                                 as608_find_fingerprints_num();
  69.                                 handler_flag = 0;                                       
  70.                                 menu();
  71.                                 break;
  72.                 }
  73.         }  
  74. }
复制代码

五: 项目展示


fff1f33386bb4a6db01c9d7bfccf47aa.png

六: 总结
都看到这里了,不妨给我点个赞啥的哈,哈哈哈哈鼓励鼓励。

==问题:==指纹这个不难。按着手册写就行,然后我这里发现了一个问题,我不知道是不是我模块有问题,还是都这样的。
就是WAK引脚,正常是不按是低电平,有手指按就是高电平,但是我发现,它不管你三七二十一,大概是每隔1分钟多点,它自动会高电平几次,然后恢复低电平。。。。。一开始以为我程序有问题,后来发现是这个模块就这样。。。。不知道大家的是不是也这样。

如果我哪里写的有问题,或者不好,请大家多多指教

  1. #整个工程代码。
  2. printf("+meQ:844797079\n")
复制代码

————————————————
转载:皮卡丘吉尔





2b0f16f659a040dab96be16dec75f6e1.png
003456df8173431fbd616d520c81bf34.png
b5ad9c851fd4407dab6dd74950f20a40.png
收藏 评论0 发布时间:2022-8-22 15:37

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版