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

STM32指纹识别

[复制链接]
STMCU小助手 发布时间:2022-11-29 15:00
一、 简介
7 D) t* U5 c; e5 o( h2 Y

AS608 指纹识别模块主要是指采用了杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹识别芯片 而做成的指纹模块,模块厂商只是基于该芯片设计外围电路,集成一个可供2次开发的指纹模块;所以,只要是基于AS608芯片的指纹模块,其控制电路及控制协议几乎是一样的,只是厂家和性能不同而已。


: O6 Q9 o2 m1 ?  F6 J

三、 AS608模块引脚描述

Vi 模块电源正输入端。
! x: K# C4 \) o1 t+ ETx 串行数据输出。TTL 逻辑电平! V8 |5 B. `4 k" U0 }
Rx 串行数据输入。TTL 逻辑电平- W0 f8 x% Z$ j& x
GND 信号地。内部与电源地连接
. S/ n) s# j! ]1 w% PWAK 感应信号输出,默认高电平有效7 o2 @0 b: f3 ~7 }2 @
(用户可读取状态引脚(WAK)判断有无手指按下)  Y2 g+ z2 h$ y5 Z
Vt 触摸感应电源输入端,.3v 供电: M7 Y% e8 S8 l+ ~  O
U+ USB D+( ]  L; t/ w8 K7 Y8 D0 i
U- USB D-


$ V9 g. u; J$ @4 S7 M# g

四、开发流程

640 (1).png


0 V( @' D* y( f. g1 Z& l

5 x$ D# l1 i% M" f3 ]" ]  m0 s3 \7 c
640.png

) B7 Q! f' p. f
程序
/ v8 u9 l7 u' ]  J. ~AS608.H
* }6 l7 H; Q9 [& X0 M" ]# {
  1. #ifndef __AS608_H
    ! s* u' W' v. h& c, A' L
  2.   #define __AS608_H! }8 r, R  @" y3 o1 Q
  3.   #include <stdio.h>
    ) T) Z! ]; ^0 s8 T& x9 {
  4.   #include "stm32f10x.h" * M6 ]4 V0 _* w5 F
  5.   #define AS608_USER     1
    . m* y0 ]7 W  R- i3 S9 U/ O
  6.   #define PS_Sta   PAin(6)//读指纹模块状态引脚$ b) @2 |8 u! l% d; p( c% C+ d4 Z
  7.   #define CharBuffer1 0x01; [* E1 }( u" S2 n; Y
  8.   #define CharBuffer2 0x02
    ( P# m: f  M  z. G$ i7 E  w( ?
  9.   
    4 Y8 K# z1 R$ e$ S8 g
  10.   extern u32 AS608Addr;//模块地址
    6 |: Y3 i# Q8 `! E) L
  11. " H8 t4 Q$ o9 P6 M
  12.   typedef struct  3 I  t5 D/ ^/ |+ w
  13.   {! K$ Z! x/ {0 b3 `9 F/ C! G# ?7 {& ?
  14.     u16 pageID;//指纹ID0 g# r9 O$ D* T1 E  H
  15.     u16 mathscore;//匹配得分& ^' |" u* \+ n3 R0 V
  16. }SearchResult;8 r4 \1 M3 z9 ~/ x
  17.   typedef struct
    ( j6 I% N1 c/ o, G* r
  18.   {- ^: \! Q& ?3 p2 W, N; M
  19.     u16 PS_max;//指纹最大容量
    * \9 I( j3 R9 J! x+ C$ @" ~3 g( d
  20.     u8  PS_level;//安全等级8 N) ^" C$ I! `
  21.   u32 PS_addr;
    & k0 \& r- V5 I" C
  22.     u8  PS_size;//通讯数据包大小6 Q6 l. B- K8 l1 ^/ @( K6 _( {
  23.     u8  PS_N;//波特率基数N6 `: K/ \9 j9 C) n# u
  24. }SysPara;, M1 }# Q7 a' S) E' _- s- a+ a
  25.   void PS_StaGPIO_Init(void);//初始化PA6读状态引脚
    7 z& p$ e( Q* W
  26.   u8 PS_GetImage(void); //录入图像 0 r7 w/ A/ q- E5 [& o2 j/ T- b7 }
  27.   u8 PS_GenChar(u8 BufferID);//生成特征 # M& E+ g/ \* {# y; @
  28.   u8 PS_Match(void);//精确比对两枚指纹特征
    / e3 K( Q+ A9 B% f
  29.   u8 PS_Search(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p);//搜索指纹
    + ^' L1 A) r. b
  30.   u8 PS_RegModel(void);//合并特征(生成模板) - ^( J% _( c* \
  31.    
    9 x& I# O7 C) L2 X# h/ @5 t  Z0 F
  32.   u8 PS_StoreChar(u8 BufferID,u16 PageID);//储存模板
    . Q$ \& D- f  R  X) W0 |( S9 j
  33.   u8 PS_DeletChar(u16 PageID,u16 N);//删除模板
    + |! X8 v& ?8 I! W$ M
  34. u8 PS_Empty(void);//清空指纹库
    " q# b1 V$ i6 n; |- V

  35. ! x# E/ X! q% h7 g) u
  36.   u8 PS_WriteReg(u8 RegNum,u8 DATA);//写系统寄存器
    - u  P" w2 x. `$ u& t- v) b- T3 W

  37. 5 \8 `# E# a: U2 J$ S& n5 U
  38.   u8 PS_ReadSysPara(SysPara *p); //读系统基本参数 5 F$ U0 ^# B8 E% K3 Z: V
  39. & o' r$ }2 S4 d! y& G' X7 D
  40.   u8 PS_SetAddr(u32 addr);  //设置模块地址
    1 ~% A- X, S0 \
  41.   3 c0 l- F& x4 y" M2 \( w- ]; D
  42.   u8 PS_WriteNotepad(u8 NotePageNum,u8 *content);//写记事本
    * z7 a+ H3 U" S; ]
  43. 0 k4 O4 i* c! Q. D0 ^1 S2 ~# Z
  44. u8 PS_ReadNotepad(u8 NotePageNum,u8 *note);//读记事 " v' b& m7 r! ^" M
  45.   0 q% P$ w, J/ x8 A
  46.   u8 PS_HighSpeedSearch(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p);//高速搜索
    " s* w! d4 o- H( R5 c# X1 z
  47.    
    & D* H' @3 G: S8 ~" H% P
  48.   u8 PS_ValidTempleteNum(u16 *ValidN);//读有效模板个数
    * L" P9 L7 k/ e7 J+ o: ?
  49.   ' c* n: H/ h7 g1 A
  50.   u8 PS_HandShake(u32 *PS_Addr); //与AS608模块握手
    ( n$ V; w1 m7 @* o
  51.   4 {1 e9 J) j4 e4 i
  52.   const char *EnsureMessage(u8 ensure);//确认码错误信息解析9 \  {3 A" m3 H" V
  53.   
    " }7 z5 V* j; i9 h+ T: t! [
  54.   #endif
复制代码
( L1 K2 g# m# ]; p2 m
AS608.C

, ^! ?4 v( i' j# ?. y& q
  1. #include <string.h>* W& `" u- g$ a! S. c5 l
  2. #include "delay.h"   , ~+ ]1 y+ U- w2 L- G
  3. #include "usart2.h"# M4 X4 p! `2 j- g& `
  4. #include "as608.h"
    ! G9 Q" q0 f/ I% D' j, F8 K
  5. : l( ~; }: `0 B" E# g
  6. u32 AS608Addr = 0XFFFFFFFF; //默认8 g! u5 n0 ~- H$ K$ |% o
  7. * r" b: b5 j. d
  8. //初始化PA6为下拉输入        / W7 D) q2 M1 d; K1 O
  9. //读摸出感应状态(触摸感应时输出高电平信号)$ g) X0 p( k9 n2 p
  10. void PS_StaGPIO_Init(void)8 V, I, D/ s  T! S1 x
  11. {   4 h$ t: [  g2 s7 ?) F
  12.   RCC->APB1ENR |= 1<<2;//使能PORTA时钟8 ^* D# E& s; ~
  13.   GPIOA->CRL &=0XF0FFFFFF;//复位PA6" r. n' v& R+ S. C/ j' m
  14.   GPIOA->CRL |=0X08000000;//输入模式,默认下拉: e, {4 D1 r" c" S4 p3 ^5 Z
  15.   GPIOA->ODR &=~(1<<6);//下拉
    + K( _9 Z4 m3 L+ C3 m' M
  16. }
    6 N) D6 @3 z1 ^8 q
  17. //串口发送一个字节/ y7 \: H: V1 b5 e
  18. static void MYUSART_SendData(u8 data)7 ~5 F: D  u  c4 h# s; K4 z
  19. {) p, ?/ D5 H% I: ^; \. e7 ^0 o
  20.   while((USART2->SR&0X40)==0); 5 T0 Q* u3 s0 W  v
  21.   USART2->DR = data;
    3 e# E- {4 A" Q8 v4 Y
  22. }5 q) [5 y! C- c/ r' w, m- g
  23. //发送包头. j3 N5 O- r! v: Y$ f) k& a
  24. static void SendHead(void)
    8 }2 q9 w8 J& M, }9 ?7 O. e& R2 r
  25. {
    & W; x5 \; W* g6 y
  26.   MYUSART_SendData(0xEF);4 V6 f8 q! x( O) U
  27.   MYUSART_SendData(0x01);
    ! ~1 f( ^' z1 g
  28. }
    5 q$ {# ~* m5 e2 W
  29. //发送地址
    / @, H8 y; p! k. A6 `- g# l( @
  30. static void SendAddr(void)+ B4 Q. p. m% M7 Y4 `
  31. {
    % i$ u6 S: ?& Y$ s
  32.   MYUSART_SendData(AS608Addr>>24);
    ) o8 u6 C; S0 S* `9 Q7 Z. w0 e
  33.   MYUSART_SendData(AS608Addr>>16);
    ; B  G( O8 o/ w5 ~
  34.   MYUSART_SendData(AS608Addr>>8);
    : B9 U2 d# g* F* f# w; r$ y0 b
  35.   MYUSART_SendData(AS608Addr);5 G- k4 k, K8 N7 Z3 U$ ]7 H
  36. }' @  ?; e& j. _! |: Z) R" F
  37. //发送包标识,1 `1 Y5 b9 }9 v4 A
  38. static void SendFlag(u8 flag)+ {$ o. @* r; {" u# j4 `( N+ U
  39. {7 K1 x. ?/ M9 A3 B
  40.   MYUSART_SendData(flag);8 S: v' A+ `7 C
  41. }8 R" t$ h1 N: Y
  42. //发送包长度$ B% y; p9 r( m$ ~; P# m
  43. static void SendLength(int length)! O: Z/ J5 j: j: d2 ~2 C( D
  44. {
    $ i/ X! S) h  s, q" y
  45.   MYUSART_SendData(length>>8);
      d3 e9 L' a3 ^, k! p4 ]6 B
  46.   MYUSART_SendData(length);2 G* B/ s9 w4 s3 Y; W  V
  47. }# o9 ~! r: \1 S  X( q- h3 p, W
  48. //发送指令码
      l7 `% i* u2 D
  49. static void Sendcmd(u8 cmd)
    # b5 t" |9 |4 U# n" U, Q, o- G
  50. {
    4 t9 n; w' w* O% ], J7 x% l
  51.   MYUSART_SendData(cmd);
    3 A1 ^2 P0 j. {  }7 R  n, i' @5 m
  52. }
    7 U4 q3 C! ~8 G# t9 ^! H2 m
  53. //发送校验和- Y4 y7 x* M3 r7 Q* T5 C9 o- b4 Z
  54. static void SendCheck(u16 check)
    1 ?- H, `& @, x
  55. {! C& L3 f4 _, t- T
  56.   MYUSART_SendData(check>>8);, @* p& }4 r; M
  57.   MYUSART_SendData(check);+ w; h0 C8 o/ _, @; s$ g# n& W
  58. }
    9 [( f6 ?, v; z$ L1 \' [1 G- R. f# K
  59. //判断中断接收的数组有没有应答包
    " h- S% v4 o1 b7 s
  60. //waittime为等待中断接收数据的时间(单位1ms)
    , _+ j# b! O  ?$ K  i6 F0 M
  61. //返回值:数据包首地址
    : j$ z# q# y) a: C. b% P1 ~  T0 g
  62. static u8 *JudgeStr(u16 waittime)6 _0 C5 o, N6 h. ~
  63. {6 {' W4 _, R( D& C% v
  64.   char *data;
    + b: b/ D4 Q8 n+ a, j. l
  65.   u8 str[8];
    + a6 e7 d( U" K* u
  66.   str[0]=0xef;str[1]=0x01;str[2]=AS608Addr>>24;, b3 q' M+ G  ]# {/ N  D
  67.   str[3]=AS608Addr>>16;str[4]=AS608Addr>>8;
    " v% n6 c* f0 i9 L6 H
  68.   str[5]=AS608Addr;str[6]=0x07;str[7]='\0';6 {6 a! Q, B% G1 ~7 `4 B- R# E! r
  69.   USART2_RX_STA=0;
    0 m# c& n# \9 T  U8 x3 O
  70.   while(--waittime)
    ) Y1 _& F8 C* k7 {, I2 ^
  71.   {& {; b  t& M8 f
  72.     delay_ms(1);
    " n3 V( {. A! w8 ^# }5 B
  73.     if(USART2_RX_STA&0X8000)//接收到一次数据, S: ]& g  S# J: G+ s
  74.     {
    - ^# K) l, S" e* c
  75.       USART2_RX_STA=0;& @6 Z& o8 n& F* T5 T' Y/ }; l
  76.       data=strstr((const char*)USART2_RX_BUF,(const char*)str);) w2 N7 ~' V$ H& ^. m
  77.       if(data)
    " s" [' }+ }' x- X7 F" d
  78.         return (u8*)data;  
    + s  N5 E' K4 a5 g+ S3 g' n
  79.     }
    4 [$ \1 z7 t8 l& b$ N! Z
  80.   }
    : B  f  I7 y7 W2 W2 t
  81.   return 0;
    ' m4 w4 k3 j* U
  82. }
    1 [2 r+ p$ @5 l0 ]. ~
  83. //录入图像 PS_GetImage
    9 D" ~* W* e* f7 E* s6 o6 R' r
  84. //功能:探测手指,探测到后录入指纹图像存于ImageBuffer。! u# I9 ~1 Y0 q* I  z
  85. //模块返回确认字) U, u1 F& }& D! c3 D
  86. u8 PS_GetImage(void)! e$ R; J1 `7 d" M% e# i
  87. {
    * ?$ `6 E+ \; u' x" {/ s* N
  88.   u16 temp;
    / ?+ `" L& J7 j2 f
  89.   u8  ensure;: f# G3 O; o, n$ K9 [9 X" W
  90.   u8  *data;
    , D4 T: c6 Z, x. q# y% y! S; t/ M
  91.   SendHead();! }/ t/ Z. Q( i4 n
  92.   SendAddr();7 S! v5 X5 m' c* F+ u! W' R
  93.   SendFlag(0x01);//命令包标识, a% k  D5 B' e& J
  94.   SendLength(0x03);
    / O) |3 _1 u1 }$ @* C0 @6 Z6 K
  95.   Sendcmd(0x01);/ d9 v: l- M! S: W! O) X
  96.   temp =  0x01+0x03+0x01;+ k8 N- S6 u4 ]$ @# i% c$ @" L
  97.   SendCheck(temp);
      h/ u" x6 z& U! b& w3 f
  98.   data=JudgeStr(2000);
    / g. ?# w5 `" u$ T: Y
  99.   if(data)9 D  @/ K6 a, B, p
  100.     ensure=data[9];; o1 r: d' Q8 Q6 W5 l
  101.   else
    ! s! B: x# E7 A* {4 [; i( P  {) Z
  102.     ensure=0xff;7 n* M) f) J( s: I* \8 i
  103.   return ensure;
    + {1 B3 y4 V- ?$ S: V6 f
  104. }2 o6 m8 I6 I5 L* }; U: z7 o
  105. //生成特征 PS_GenChar
    1 t3 d9 |. X9 z2 s
  106. //功能:将ImageBuffer中的原始图像生成指纹特征文件存于CharBuffer1或CharBuffer2       ; m# l( R1 g  G" u8 k/ x
  107. //参数:BufferID --> charBuffer1:0x01  charBuffer1:0x02                        
    9 X" b6 F3 L! o4 @1 @. ^" x- z
  108. //模块返回确认字
    . e& ~; J& `" [2 q
  109. u8 PS_GenChar(u8 BufferID)
    7 @. r0 p3 ?& ^* i# I: f
  110. {
    $ h6 Q7 _) X3 Q- E' g1 I
  111.   u16 temp;# G# o' Q4 n6 t4 L0 ]* E
  112.   u8  ensure;) E& }2 C& i. G$ C) z
  113.   u8  *data;; H! T0 U8 A: c6 O& g
  114.   SendHead();1 U) F4 g6 a3 a1 Q; P
  115.   SendAddr();
    . S% X! l% W' [2 {% s1 {
  116.   SendFlag(0x01);//命令包标识
    3 i0 m3 I) x2 l* d; ?9 Z; ^! l
  117.   SendLength(0x04);% m, \$ p$ o' y% J: a/ I
  118.   Sendcmd(0x02);( w& j/ m! N- }9 E- B$ z
  119.   MYUSART_SendData(BufferID);  x2 d) I  I; [2 [5 G% [
  120.   temp = 0x01+0x04+0x02+BufferID;
    ; K! V& ^6 c! a5 z8 p& F7 \' g
  121.   SendCheck(temp);
    ( f9 C8 J& b$ ?1 f) j
  122.   data=JudgeStr(2000);# m. v. U: J: U$ \' n# j
  123.   if(data)
    $ `; C+ D  o6 v2 u, d
  124.     ensure=data[9];
    4 D4 c, J8 x4 x1 N! b
  125.   else5 f7 T. C* r1 {+ J+ S+ N0 R
  126.     ensure=0xff;
    2 g; k; F) M) j; Q  Y" ?
  127.   return ensure;
    1 f% T( U) h9 Z  S3 v1 |
  128. }1 R! Q: \( c% d8 Z% j5 v
  129. //精确比对两枚指纹特征 PS_Match
      K5 ]! Q( v2 P  T0 V% f$ ?
  130. //功能:精确比对CharBuffer1 与CharBuffer2 中的特征文件
    3 P* e/ `/ m# p) i6 A# F: Z
  131. //模块返回确认字
    # B, r" b0 o+ S
  132. u8 PS_Match(void)8 S( C" m% n- [) V) J
  133. {
    % M3 V7 L; f9 i
  134.   u16 temp;$ [2 W* p/ g+ a% A: _8 e
  135.   u8  ensure;
    0 ]; c1 e# z; d+ L0 Y
  136.   u8  *data;
    / y1 ^% `" [* H7 d6 L
  137.   SendHead();2 A. ~) I; G$ \4 i- d7 g3 j
  138.   SendAddr();" S: @# R- ~1 V# C1 A1 f$ L  C
  139.   SendFlag(0x01);//命令包标识
    / {3 p2 v! I; D% w  I3 G
  140.   SendLength(0x03);
    4 f, Q4 p5 y# x  j1 b" c) n
  141.   Sendcmd(0x03);
    1 B% v  V9 w( v, g  o, g( S# ?7 K
  142.   temp = 0x01+0x03+0x03;
    & M1 L) ?  B$ V# ^* }
  143.   SendCheck(temp);
    0 L0 D8 p4 x( C
  144.   data=JudgeStr(2000);
    & Q* k$ V& Q! C  d  W* v
  145.   if(data)3 I3 n2 y3 n* Z& O
  146.     ensure=data[9];5 m2 J9 }: a+ W0 A, u# z+ ?' \( T
  147.   else4 e9 Y7 f' M0 v6 \2 j7 \
  148.     ensure=0xff;1 E1 Y  U+ g9 C& l. p
  149.   return ensure;7 L5 o& K6 Y  k$ b- y
  150. }. W- e6 X/ }) v9 R5 o; k
  151. //搜索指纹 PS_Search
    7 q$ p+ q) j! i- e; V. x0 G
  152. //功能:以CharBuffer1或CharBuffer2中的特征文件搜索整个或部分指纹库.若搜索到,则返回页码。: c( i! F6 E$ A8 Y3 C0 M, k# Y
  153. //参数:  BufferID @ref CharBuffer1  CharBuffer2
    / ^" R. Q! U# Y1 S  a. o% v8 q
  154. //说明:  模块返回确认字,页码(相配指纹模板)1 \5 _- z% ]: @% d9 z; o% p% a
  155. u8 PS_Search(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p)
    + o" V, h6 M' w
  156. {
    . A, r- O1 b1 e2 s" G9 A
  157.   u16 temp;, {7 ?* q" x$ ^, z
  158.   u8  ensure;
    8 |8 h0 A' a+ U: m1 E  p& ~
  159.   u8  *data;
    % W- _5 ^4 M. b/ b/ A
  160.   SendHead();
    & Q6 Q) H5 t2 m8 ]' g. v
  161.   SendAddr();
    ; w+ I. |- Z5 _1 I
  162.   SendFlag(0x01);//命令包标识
    5 Y7 S" X9 a& F* H5 d$ \
  163.   SendLength(0x08);
    1 C+ b2 T$ s* @% {! O
  164.   Sendcmd(0x04);* b$ {$ [3 F! T
  165.   MYUSART_SendData(BufferID);1 c: L3 V; R( V0 Z
  166.   MYUSART_SendData(StartPage>>8);+ i  B9 ]% \; z) Z  G$ R
  167.   MYUSART_SendData(StartPage);! l- ~1 ^  y3 u# M3 ]
  168.   MYUSART_SendData(PageNum>>8);
    9 {' M7 D, b5 O6 i; O4 a1 \4 M
  169.   MYUSART_SendData(PageNum);
    7 r9 v) y- J0 g. E
  170.   temp = 0x01+0x08+0x04+BufferID# Q. f" s+ V: |4 Q1 W
  171.   +(StartPage>>8)+(u8)StartPage
    ! n% r( g' j- L
  172.   +(PageNum>>8)+(u8)PageNum;4 k7 v; ?$ Z6 l  j& `& x1 t* s, C! B
  173.   SendCheck(temp);
    " J6 z( t: R4 z+ E7 `5 t% w( H7 w
  174.   data=JudgeStr(2000);
    4 m( G3 T, r1 j$ G1 N
  175.   if(data)
    9 w2 |. v9 S- |  A0 S
  176.   {
    " A( d" m- L  f- l* b6 U' [1 G7 G
  177.     ensure = data[9];
    9 q7 t" R/ ?9 \8 i) g- m
  178.     p->pageID   =(data[10]<<8)+data[11];; q5 V$ N! w% y+ D5 n
  179.     p->mathscore=(data[12]<<8)+data[13];  ) [8 \+ e& u+ v( r5 a6 s' l, H1 S
  180.   }9 K5 Z3 T) R1 Z; |" M- L
  181.   else3 G1 F. e% ?) R* E
  182.     ensure = 0xff;
    8 P1 x# e' v' v( e
  183.   return ensure;  
    # t8 m; A2 _; F' q3 Q% I
  184. }
    ) b6 n, q' ^! v/ p7 e- a
  185. //合并特征(生成模板)PS_RegModel7 I3 i1 I/ S- q' ^
  186. //功能:将CharBuffer1与CharBuffer2中的特征文件合并生成 模板,结果存于CharBuffer1与CharBuffer2  ) h: x3 `( Z. q
  187. //说明:  模块返回确认字
    1 A6 Q5 J, Q) Y4 Q' ^* y' \
  188. u8 PS_RegModel(void)
    4 r& A6 V" c0 y+ k2 p+ Z3 c
  189. {2 c+ M9 m; A6 c/ i& \; D5 L( ^# e
  190.   u16 temp;6 [; X0 Z1 R* W+ g5 @& n
  191.   u8  ensure;4 _, K) \3 {3 C, d0 _+ U; Q
  192.   u8  *data;
    % t7 p& t& n/ \/ \2 Q
  193.   SendHead();
    # R, p0 u- e! T: i8 i# A
  194.   SendAddr();3 \( ]4 J4 h2 p' A& @6 i
  195.   SendFlag(0x01);//命令包标识9 b* L; v! i) B3 v# G
  196.   SendLength(0x03);
    ( n7 N4 X0 [) i+ y  D/ e
  197.   Sendcmd(0x05);& a2 a! Y! S/ }1 k
  198.   temp = 0x01+0x03+0x05;5 |9 C: s* [" A9 T1 E9 H
  199.   SendCheck(temp);5 Z7 q+ O" V9 x, z+ q* @$ p
  200.   data=JudgeStr(2000);
    6 F- H! N3 w$ K' B6 x
  201.   if(data)
    9 {3 H4 u: k2 u. F- M- w% i0 i
  202.     ensure=data[9];
    3 q$ X  E0 N* q7 \; n
  203.   else
      i4 x8 L, V! X
  204.     ensure=0xff;8 [# a2 Z0 c  w
  205.   return ensure;    ! w' S5 u" M; O
  206. }
    + _) }* H4 P9 i5 g! P+ o* s5 O" n
  207. //储存模板 PS_StoreChar0 ^2 R/ V: i0 T6 u: t7 A
  208. //功能:将 CharBuffer1 或 CharBuffer2 中的模板文件存到 PageID 号flash数据库位置。
    # `$ E; I$ [5 s4 [( e2 r
  209. //参数:  BufferID @ref charBuffer1:0x01  charBuffer1:0x022 M3 i/ @. \- o2 u
  210. //       PageID(指纹库位置号)) g5 R+ u3 ^$ _- I7 [6 D' z: Y
  211. //说明:  模块返回确认字
    : a, }' |6 n& R  A8 @
  212. u8 PS_StoreChar(u8 BufferID,u16 PageID)+ k& y& A: V* P9 m1 s, V5 O
  213. {0 e7 i0 Y: X+ H" F" ?0 F
  214.   u16 temp;& d* C2 Z& _' \
  215.   u8  ensure;
    ! T* ~, z  O# V6 ~  o* ~$ s# |
  216.   u8  *data;8 y1 D' {0 S1 ]+ L7 ^; R2 ]
  217.   SendHead();7 ?* f( V- s5 k. N2 P! D# K8 i, i
  218.   SendAddr();
    $ c- ]2 r6 G5 A3 d
  219.   SendFlag(0x01);//命令包标识& m  Y$ H5 P1 v( d7 ]7 i
  220.   SendLength(0x06);
    ; P2 @( {2 k5 q- f  Y. q
  221.   Sendcmd(0x06);
    ) k8 M$ w% t/ ?; A$ j5 c
  222.   MYUSART_SendData(BufferID);% I* u, q! R# o3 X; F+ e
  223.   MYUSART_SendData(PageID>>8);4 \  I, |1 s  l5 z$ p0 e+ _; o$ \
  224.   MYUSART_SendData(PageID);
    6 G9 I/ v" [+ R. G1 d4 y+ v7 \
  225.   temp = 0x01+0x06+0x06+BufferID( b9 L+ L- D- Z- a5 G% M" y. O
  226.   +(PageID>>8)+(u8)PageID;
    ! \7 }  E1 n4 d1 T' L
  227.   SendCheck(temp);
    , H* P4 t0 ?, G  o8 M! D3 i
  228.   data=JudgeStr(2000);
    3 q  P5 D( n; ^' X
  229.   if(data)4 W  ~0 P- w. I0 R
  230.     ensure=data[9];* Z/ r: G3 {( q: I0 S3 x* `7 ]5 ?
  231.   else
    6 g+ [: n4 b/ u% b. J) Q
  232.     ensure=0xff;( E4 h" r7 B9 I$ A9 n% s2 B
  233.   return ensure;  8 a5 s5 H; R2 o5 N9 V7 ?& \6 l
  234. }
    : `0 F5 V, Z' @% ]: ^5 v9 ^2 U% h4 C. Y
  235. //删除模板 PS_DeletChar* j: g# m2 t; ?
  236. //功能:  删除flash数据库中指定ID号开始的N个指纹模板
    4 u2 ~) \9 Z+ V4 k9 N
  237. //参数:  PageID(指纹库模板号),N删除的模板个数。
    ' f8 A2 Z0 \# ]& ~+ P% v" }* V) p1 r
  238. //说明:  模块返回确认字- h. V- P; l& o& H
  239. u8 PS_DeletChar(u16 PageID,u16 N)
    . l8 S  j" ~  u( z( \8 x% G$ R
  240. {  \4 n- `! s  n
  241.   u16 temp;. c2 \5 @5 @+ \( }
  242.   u8  ensure;
    ; O+ l4 ^- d" ~! T) W3 W3 Z
  243.   u8  *data;
    ) f. o- t! l2 A1 w8 M
  244.   SendHead();
    & X# C3 h% a- Y# w; `) A2 I
  245.   SendAddr();2 O0 E' C9 e( N& e
  246.   SendFlag(0x01);//命令包标识
    0 \  J  k0 V2 ^0 Z6 v8 D9 M3 J
  247.   SendLength(0x07);
    ! t2 W' l5 O' ?+ D; y+ [# m
  248.   Sendcmd(0x0C);4 V. `) u. K* o! Y+ O8 p
  249.   MYUSART_SendData(PageID>>8);
    ; L4 V2 \0 q& V0 A( U
  250.   MYUSART_SendData(PageID);
    . |; k# d- M! a( t, ]" p# r
  251.   MYUSART_SendData(N>>8);+ |! b, a4 J- q
  252.   MYUSART_SendData(N);
    1 o  l6 P1 a7 A# M; C
  253.   temp = 0x01+0x07+0x0C
    6 U; l  l6 Z* d5 T
  254.   +(PageID>>8)+(u8)PageID
    1 x# O* I) C( F0 }/ l
  255.   +(N>>8)+(u8)N;
    2 Y$ h$ j0 {3 u: Q9 q0 q
  256.   SendCheck(temp);& e+ j& \5 p7 p2 C' c7 F( y
  257.   data=JudgeStr(2000);
    / Q1 B/ I1 i5 g( b( ~+ B
  258.   if(data)% a' u. Y  f% m, k
  259.     ensure=data[9];
    * S& b$ W: W' W$ f; d
  260.   else
    / d# @# K5 P8 l0 @: y
  261.     ensure=0xff;
    , Q) n! N# I# y/ }
  262.   return ensure;
    ( ~4 r8 v7 Z9 y9 a3 z; O$ I
  263. }
    # j: W" p- V$ H4 V
  264. //清空指纹库 PS_Empty! {. f9 N; N4 Y0 |
  265. //功能:  删除flash数据库中所有指纹模板7 V0 J$ f- k5 ]
  266. //参数:  无
    / t: a- P, b0 \' C  I- J
  267. //说明:  模块返回确认字
    0 u9 _! s* B* w2 v6 Q
  268. u8 PS_Empty(void)& D) `, B! V: t: b6 k, \* H
  269. {3 b9 w0 d4 v8 Y2 w2 f1 K: O
  270.   u16 temp;
    8 M, g3 O8 s+ B% Z  j+ K; @' I" E
  271.   u8  ensure;( v- r8 }7 |; Q( S0 Q# q
  272.   u8  *data;
    # J4 E% V- _) S: l% f' R
  273.   SendHead();" G1 `3 v  r' r8 |: o7 t
  274.   SendAddr();
    , L4 f2 i  H& n/ K- b
  275.   SendFlag(0x01);//命令包标识
    4 h3 i. c# @' o% p
  276.   SendLength(0x03);
    * h) m! ^9 L: o) P1 L
  277.   Sendcmd(0x0D);! L+ o" e( {4 L% j$ O
  278.   temp = 0x01+0x03+0x0D;7 P  u, I1 G) \8 R% x' [( d
  279.   SendCheck(temp);$ x% b- L) G2 \  g" J1 \
  280.   data=JudgeStr(2000);8 I0 a: y$ w; e. e- g5 z
  281.   if(data)4 x; Y' ~2 r8 _/ B8 o
  282.     ensure=data[9];* S& g4 F$ C; \
  283.   else2 i& m- D' A0 X9 z8 \! q( k
  284.     ensure=0xff;
    % y& G9 Y0 X7 E, r/ r0 z$ `
  285.   return ensure;
    ( P  D$ h' `$ r$ X; H2 K8 n
  286. }2 Q. v. C2 s6 k* W1 v( F
  287. //写系统寄存器 PS_WriteReg
    8 _/ Q# {# B: z! q2 E6 }+ X
  288. //功能:  写模块寄存器) V+ y1 T+ E; n% T0 b4 }) k% m
  289. //参数:  寄存器序号RegNum:4\5\61 Y' e! ~0 q1 i2 V! e" z9 a
  290. //说明:  模块返回确认字8 [2 D) ]; {2 w6 W- {
  291. u8 PS_WriteReg(u8 RegNum,u8 DATA)
    # X  N% h3 h- q
  292. {: Q! i; y+ D5 h: [- \
  293.   u16 temp;  T7 v! U! C" G: Q2 l5 ?
  294.   u8  ensure;
    : u& F( }1 i" N- ?8 ?) {- n; L/ L
  295.   u8  *data;
    # k  P- G3 B$ m9 S: V
  296.   SendHead();
    3 u, m6 T+ R5 U! o/ }5 C( y
  297.   SendAddr();
    % a- O5 `/ k2 ~9 H' s, c
  298.   SendFlag(0x01);//命令包标识
    / P7 L8 M! |+ r' ~
  299.   SendLength(0x05);( x; Y! T/ z9 O
  300.   Sendcmd(0x0E);
    / M% R3 i5 V* X
  301.   MYUSART_SendData(RegNum);( u0 I$ K0 W8 f0 h9 C0 ~
  302.   MYUSART_SendData(DATA);
    ! y9 V1 L- X% }$ O! \9 f; S
  303.   temp = RegNum+DATA+0x01+0x05+0x0E;
    # y, h& O) C; m: [8 }
  304.   SendCheck(temp);# g4 B, ^# O# _
  305.   data=JudgeStr(2000);
    ( U1 S0 n; c1 I
  306.   if(data)& `. r+ H/ e$ a' A! O
  307.     ensure=data[9];& v( d4 j- v0 f% A$ b
  308.   else
    7 k' l6 G3 ~& O! r' z( f0 ]$ o
  309.     ensure=0xff;
    ! l3 k0 j7 G! W( J2 o. L* y; A) E
  310.   if(ensure==0)
    + T5 Y, W$ u5 T: S" e
  311.     printf("\r\n设置参数成功!");
    4 L7 @& z$ R8 }) g5 m1 N$ u' {
  312.   else  l- M7 |) m5 k$ H
  313.     printf("\r\n%s",EnsureMessage(ensure));
    9 m; B( R2 A8 C5 @- s7 l
  314.   return ensure;
    + s6 X7 N) y0 r, B
  315. }5 ]. {4 j; u$ ]* m; ?( V
  316. //读系统基本参数 PS_ReadSysPara
    " ]4 Z! C  g3 e4 C
  317. //功能:  读取模块的基本参数(波特率,包大小等)1 ]/ T( V1 r$ S; `: t- B
  318. //参数:  无( ?% ~( W+ P1 }% i
  319. //说明:  模块返回确认字 + 基本参数(16bytes)" U& `) y/ L$ r
  320. u8 PS_ReadSysPara(SysPara *p)1 }4 c) C7 S* J7 [
  321. {& R7 c- D; L9 Q! r! R5 F, }" S: l  b
  322.   u16 temp;
    1 S/ V/ @# i+ |3 U
  323.   u8  ensure;( J4 k4 i$ f" }. r: f
  324.   u8  *data;
    3 }- G  d# a5 d# [8 I; V
  325.   SendHead();
    % c$ v3 d2 k7 }( l
  326.   SendAddr();
    6 Q: {& t! V( U: }2 B6 R2 B, G$ s
  327.   SendFlag(0x01);//命令包标识
    " H" [1 ^- R0 U- a1 w
  328.   SendLength(0x03);7 b; R' w( _# [/ x  I8 ]- \2 n6 R
  329.   Sendcmd(0x0F);+ l1 \6 ]: P% l$ P. E7 B; d
  330.   temp = 0x01+0x03+0x0F;" H! K6 r1 M# I& t( p% Q  j
  331.   SendCheck(temp);
    / w  l) ]+ V" H3 K% D  R6 r6 D
  332.   data=JudgeStr(1000);
    " e$ t/ s4 s; Z
  333.   if(data). _* f* j# `, x# J  W# v& x
  334.   {
    4 X, Y; b5 d, U
  335.     ensure = data[9];4 w1 R- I4 d8 A* S$ Z& _
  336.     p->PS_max = (data[14]<<8)+data[15];7 y2 `% s$ n' Q# K: N* z4 @, |* O# v
  337.     p->PS_level = data[17];0 ^& G+ E! I0 m) ^
  338.     p->PS_addr=(data[18]<<24)+(data[19]<<16)+(data[20]<<8)+data[21];$ q% A2 r1 R: Q2 h
  339.     p->PS_size = data[23];
    ; j8 j! Z" f- F5 q+ z* t
  340.     p->PS_N = data[25];
    2 f0 x$ g& T0 I7 Z! q* v$ B$ _: ~
  341.   }   
    : U. u* u& q# U8 f) [4 k/ m# m2 N. j
  342.   else1 B" A- U) Z; w3 j; w
  343.     ensure=0xff;
    , e! C+ S$ C9 s; D; W8 s
  344.   if(ensure==0x00), n2 j4 r: f4 Y9 H2 i
  345.   {9 V. |6 N# z- E' K
  346.     printf("\r\n模块最大指纹容量=%d",p->PS_max);
    " L+ d3 p; z; ]: h- r
  347.     printf("\r\n对比等级=%d",p->PS_level);
    $ F7 ]9 D. Y3 n- _3 T3 v
  348.     printf("\r\n地址=%x",p->PS_addr);& z' P3 V! f# |0 w* a  }* C, c
  349.     printf("\r\n波特率=%d",p->PS_N*9600);' c$ v1 A. D" |/ C
  350.   }
    . O3 q( _" a+ |, J. O$ k; i
  351.   else
    9 R) M7 Y( n, C5 O8 X5 o6 N
  352.       printf("\r\n%s",EnsureMessage(ensure));& j. x, `5 l9 V: K8 o! ]; d
  353.   return ensure;" O0 V; y$ d  c2 r
  354. }
    - ?% P: b2 |; A* f- }
  355. //设置模块地址 PS_SetAddr
    & \2 V; U8 w; o6 L" H
  356. //功能:  设置模块地址' U: b) y  j) ~3 P: L* J, M
  357. //参数:  PS_addr$ |* b; P( `. x7 x/ W
  358. //说明:  模块返回确认字
      Y1 m; Z8 R4 l) |# _9 c( z/ H: G
  359. u8 PS_SetAddr(u32 PS_addr)* ?; f! L; Q# A) R5 ^
  360. {$ C: j( ]* g4 v" h' l& ?
  361.   u16 temp;' M6 Z5 T& D2 {" Z/ `
  362.   u8  ensure;0 l& |$ m: h2 p6 E  }( Q+ E
  363.   u8  *data;0 |+ p9 A' g9 K# P, _" g
  364.   SendHead();
      n. S# O* k  t+ z- f6 [
  365.   SendAddr();6 z$ }  f+ @; a1 ?- ~3 V  ~
  366.   SendFlag(0x01);//命令包标识
    : R' r: l3 b8 ?# a  \
  367.   SendLength(0x07);
    & W  _3 }) W. d. k* Z! ^+ U
  368.   Sendcmd(0x15);
    : I, ~* m2 k( S; Q: N( A
  369.   MYUSART_SendData(PS_addr>>24);
    * s* k6 z1 o# p" ^, D- ?( R, V
  370.   MYUSART_SendData(PS_addr>>16);! W4 v: k2 j8 R9 K$ r% j
  371.   MYUSART_SendData(PS_addr>>8);
    + j: o3 e+ |! a
  372.   MYUSART_SendData(PS_addr);
    5 D1 i1 a6 T8 [0 ], n/ D# @
  373.   temp = 0x01+0x07+0x157 ?) g. L8 M, R( X9 M, e5 p: \
  374.   +(u8)(PS_addr>>24)+(u8)(PS_addr>>16)
    - p2 U$ ]: T2 f0 R$ d. S1 j1 `% C+ N
  375.   +(u8)(PS_addr>>8) +(u8)PS_addr;        
    , o  _: |" R/ m1 n% F# S7 T
  376.   SendCheck(temp);& a0 D* f) s9 c7 ]) B7 E! Y8 m8 Z
  377.   AS608Addr=PS_addr;//发送完指令,更换地址0 B! I" P7 B1 m4 ^; ?$ ]
  378.   data=JudgeStr(2000);
    8 L* n  ?& w7 @* G/ x
  379.   if(data)( _7 c! k" M- f; q& `5 Q
  380.     ensure=data[9];; L1 N8 m& e' K6 R* T% y  i
  381.   else
    " B; L7 j+ r# v- K0 ]; ^
  382.     ensure=0xff;  / N+ i+ R2 G; s) @! k- q
  383.     AS608Addr = PS_addr;
    ' V- m9 j$ g5 d: q7 W) E% q
  384.   if(ensure==0x00)
    % H! a% |4 o  b+ \" z& j
  385.     printf("\r\n设置地址成功!");
    & X$ J+ x) i* h$ X1 I
  386.   else
    ( C7 j. f, D* o& t# f8 \
  387.     printf("\r\n%s",EnsureMessage(ensure));
    ( \$ i$ l8 T5 c- j+ U- V
  388.   return ensure;$ D4 r2 n, H5 u' U
  389. }
    4 U2 X. ^! \, m' B" n
  390. //功能:模块内部为用户开辟了256bytes的FLASH空间用于存用户记事本,' V# r) [1 Q. a5 ?' S' Q& F
  391. //  该记事本逻辑上被分成 16 个页。
    9 u. A+ g% P: \3 d  e, Q* |3 N8 H
  392. //参数:  NotePageNum(0~15),Byte32(要写入内容,32个字节)! }( T! V& k4 j" X* B( _: D" M
  393. //说明:  模块返回确认字
    5 r% o' T( g1 i# c$ K
  394. u8 PS_WriteNotepad(u8 NotePageNum,u8 *Byte32)4 v8 l: V* V/ z
  395. {
    + l9 l" D' Z0 t5 W  }4 p' f( a: v! {
  396.   u16 temp;
    - w* a4 i" G* g% b" P  |# |$ ]
  397.   u8  ensure,i;6 {8 Y6 [6 u+ h/ b/ g  l, a
  398.   u8  *data;) O! g* d2 M. \% Y
  399.   SendHead();
    , P: `9 f9 Q2 L
  400.   SendAddr();
    1 g4 M; I/ A6 `1 c
  401.   SendFlag(0x01);//命令包标识
    ( S) E; t& k* `, j# C! F
  402.   SendLength(36);
    , F8 s# D$ o3 T- i
  403.   Sendcmd(0x18);, }3 x4 z- `" q+ a
  404.   MYUSART_SendData(NotePageNum);- k9 R0 o. ]# l$ g- q. A
  405.   for(i=0;i<32;i++)
    ' J% ?  T: h. h$ X5 {0 f
  406.    {* n6 n- ^, O# u6 j
  407.      MYUSART_SendData(Byte32[i]);1 P$ e7 j' c' j( ^! T3 K- W. h
  408.      temp += Byte32[i];  i; k+ j) K0 T" P+ D
  409.    }1 {8 T* n6 C( F: r. T
  410.   temp =0x01+36+0x18+NotePageNum+temp;0 V7 d) Q/ V- q) B2 b1 y/ n" v( B8 d
  411.   SendCheck(temp);
    * S0 `" a4 q) u8 @" B
  412.   data=JudgeStr(2000);7 [! k; l, q2 c  j, @8 K) k# J! Z
  413.   if(data)
    , G% Y* A) c6 t* ?6 |& Y
  414.     ensure=data[9];/ W. J8 ~1 z6 v! k) k% Z: ~: u  C
  415.   else
    3 B9 _: R1 K6 A1 y, `& {! }* A: f
  416.     ensure=0xff;
    + s9 Z: {; o9 t+ _# [; T: R
  417.   return ensure;
    / y$ K" U# F% r! A/ V; J3 q3 l4 E4 \7 S9 I
  418. }
    ( D! i# i* X" Q
  419. //读记事PS_ReadNotepad
    / ]( h; P4 G# Z1 c4 N
  420. //功能:读取FLASH用户区的128bytes数据% n/ O$ p: T& |/ k0 S6 d# R' Y2 G6 F
  421. //参数:  NotePageNum(0~15)
    $ A+ G! }$ |, n3 n( j- Q
  422. //说明:  模块返回确认字+用户信息* c- P9 U% H& T3 s- x# i
  423. u8 PS_ReadNotepad(u8 NotePageNum,u8 *Byte32)* }( Q: F/ w# L; N; x7 }
  424. {
    ! q, o) J' j, T& P
  425.   u16 temp;  j! D* I3 L# z5 e+ J2 P) }
  426.   u8  ensure,i;: v9 ?3 L6 x' K- }3 T- ~
  427.   u8  *data;
    4 ~" H0 x0 Y, a. j5 B* f/ H
  428.   SendHead();
    " `2 u# E  N2 K  W' I& f* e) L9 d
  429.   SendAddr();5 B+ u  N; o) _" v5 |
  430.   SendFlag(0x01);//命令包标识# ?8 E3 j7 a4 [  o
  431.   SendLength(0x04);5 \6 ~1 a9 V. G. |5 q& x
  432.   Sendcmd(0x19);
    1 t9 p8 v' s4 Z5 [3 l: a5 T) d
  433.   MYUSART_SendData(NotePageNum);6 x& \/ Y$ H6 a9 g
  434.   temp = 0x01+0x04+0x19+NotePageNum;
    : h6 P' k! T9 L5 d: {6 z
  435.   SendCheck(temp);
    6 r; [- `' ?7 A8 `$ Z
  436.   data=JudgeStr(2000);
    - C, F+ A+ |3 u% H0 \* P& H! a9 t9 N( [
  437.   if(data)
    ! |% P9 A( j( T" v$ H
  438.   {
    & G6 p6 e/ @& _( ]5 i; V" Z5 i
  439.     ensure=data[9];
    8 ?% G6 ]# X5 p7 c% g" J
  440.     for(i=0;i<32;i++)! A: S# C( D; v/ ^+ F, x6 ]. {
  441.     {
    1 a/ }* Q, W& S+ g# X
  442.       Byte32[i]=data[10+i];
    0 }- r0 w  T  \" w
  443.     }  z5 G! g" S5 [3 P1 U0 V' _) i
  444.   }, c* H/ D, C, g
  445.   else' |  q: z. j5 C5 }, ?2 e2 \' G
  446.     ensure=0xff;0 S& a& N- p2 y' Y
  447.   return ensure;0 M& {! J4 u) b' b7 E# O$ P
  448. }
    ; g* f" J% P# Q, ^  A# a
  449. //高速搜索PS_HighSpeedSearch
    3 u* l( K# H  q9 ?) I
  450. //功能:以 CharBuffer1或CharBuffer2中的特征文件高速搜索整个或部分指纹库。0 d% t, T5 F8 f
  451. //      若搜索到,则返回页码,该指令对于的确存在于指纹库中 ,且登录时质量
    5 t1 E) x# W( ]" Q3 r6 l
  452. //      很好的指纹,会很快给出搜索结果。8 q+ k: D/ G$ n2 g
  453. //参数:  BufferID, StartPage(起始页),PageNum(页数)
    0 U% g8 m3 m7 N
  454. //说明:  模块返回确认字+页码(相配指纹模板)
    ; V  o& h3 f* k: n' j$ p$ H
  455. u8 PS_HighSpeedSearch(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p)3 [$ q. n3 e/ R( F. H
  456. {: x; `+ D0 M4 I. |+ K" ]; H9 Q
  457.   u16 temp;
    ' `" v' k' j+ N7 f& O
  458.   u8  ensure;
    ) u* [. N: E+ w1 s
  459.   u8  *data;
    4 h- `+ k" L  P: ?0 J
  460.   SendHead();) t/ B% _: F7 S( G& Z: {
  461.   SendAddr();
    1 x$ ?3 V$ [3 g0 A- \4 }4 q& ~1 J
  462.   SendFlag(0x01);//命令包标识: g: @3 u. R6 C$ |1 ]! W/ @% f
  463.   SendLength(0x08);) y2 K2 S5 X& H
  464.   Sendcmd(0x1b);
    8 C- Z; G$ A) G) `0 N& q1 T
  465.   MYUSART_SendData(BufferID);
    : Q6 M4 l" C6 G
  466.   MYUSART_SendData(StartPage>>8);
    2 w5 \6 J9 ^. i8 J/ ^0 L
  467.   MYUSART_SendData(StartPage);. E' w' f: p# @: Z5 c$ K% Z, Y
  468.   MYUSART_SendData(PageNum>>8);4 R# r7 Z( |; C# j! d5 B5 l3 z. x- y' Z0 [
  469.   MYUSART_SendData(PageNum);1 e( ~! |, O4 r$ r/ f
  470.   temp = 0x01+0x08+0x1b+BufferID! W6 _) N! C1 n; [
  471.   +(StartPage>>8)+(u8)StartPage
    3 i' m9 c' B3 L5 ]
  472.   +(PageNum>>8)+(u8)PageNum;
    3 B9 P" F$ ~$ x: b4 h3 L
  473.   SendCheck(temp);
    - w: z) |7 ?, K+ }
  474.   data=JudgeStr(2000);
    $ i' Q/ {/ u) r- c8 y
  475.    if(data)
    5 U+ H9 W; i+ Z& p* B- g4 z
  476.   {
    * F' }0 M8 s) [/ x- a- F/ K
  477.     ensure=data[9];
    2 V- X, w5 ?3 U; b: {- `
  478.     p->pageID   =(data[10]<<8) +data[11];! Y0 ?* h) B9 n+ f3 ]; |8 _7 I8 ~
  479.     p->mathscore=(data[12]<<8) +data[13];/ D2 F% v8 G9 o+ m- A# n
  480.   }
    1 d1 f. n% ?5 K% o" |  Z
  481.   else
    ( G; ?$ q" m, A% B
  482.     ensure=0xff;0 }5 R* U. g% C/ d- S
  483.   return ensure;
    ! ?+ d0 Y9 Y* a7 K( ~0 N/ F) `& e
  484. }
    , D  N4 N( x  X1 K% L
  485. //读有效模板个数 PS_ValidTempleteNum* w- t& t7 i( j% W( G0 N
  486. //功能:读有效模板个数
    * y8 u) I* Q9 {
  487. //参数: 无. i( y  H: W  N6 k8 E
  488. //说明: 模块返回确认字+有效模板个数ValidN- o: K6 Y; p# g5 \2 A" ?
  489. u8 PS_ValidTempleteNum(u16 *ValidN)$ B* _# y# D& i" u( W! b8 @
  490. {5 B+ x/ b9 C( q
  491.   u16 temp;
    # @* w0 S0 }8 M) C" W" g" m
  492.   u8  ensure;
    1 J+ x$ G; l5 b) r
  493.   u8  *data;
    3 U$ E! g6 n. M- b6 t8 j
  494.   SendHead();8 n4 }: D# S/ k+ l4 h) C
  495.   SendAddr();
    " h& p+ g! [" o, z$ s
  496.   SendFlag(0x01);//命令包标识
    ) ?" t: G3 N, {, |' }
  497.   SendLength(0x03);
    * n8 i, K9 h: Y, d0 G5 K! |
  498.   Sendcmd(0x1d);& O) J1 m, s8 y; X9 g" B
  499.   temp = 0x01+0x03+0x1d;
    - ?& I$ T8 w3 ^. q
  500.   SendCheck(temp);4 E. J( z2 Q) v7 P' s( M) x, p7 x
  501.   data=JudgeStr(2000);3 l/ ?% \- |& ]" f7 ?
  502.   if(data)
    , M; D# n5 A3 p& G" u# d
  503.   {
    % b% h6 r+ ?" y4 R& B1 `
  504.     ensure=data[9];% T% q5 k9 x8 N$ f2 n4 ~- {' n. N
  505.     *ValidN = (data[10]<<8) +data[11];3 V5 L, Y+ h8 X9 n) ^' U/ O: i
  506.   }    , l1 M/ @# `! U$ Y+ q. @* m
  507.   else
    6 V2 X. h9 s- l2 a% F3 m
  508.     ensure=0xff;
    7 I, {# _  R" y% J7 E# n2 V
  509.   4 U, W% N0 K1 W5 p  z
  510.   if(ensure==0x00)
    7 T. A6 [9 A+ |5 D+ x. u! x4 d
  511.   {  |6 Z. p4 b0 }& g6 t& U" r' }% s
  512.     printf("\r\n有效指纹个数=%d",(data[10]<<8)+data[11]);
    " `/ j' s9 ^2 X
  513.   }4 z1 o) J4 G, z- I2 @4 Q7 U
  514.   else
    0 ^" H* U% m3 ?9 h
  515.     printf("\r\n%s",EnsureMessage(ensure));  g. f) W, H0 m% u: U3 A
  516.   return ensure;
    $ {* R) S  _$ B+ ^
  517. }) A% u6 M0 I) p" \3 w  C- H
  518. //与AS608握手 PS_HandShake
    8 O, A8 W% m: Z0 D: j
  519. //参数: PS_Addr地址指针$ u$ Z, a, z' J- z2 l
  520. //说明: 模块返新地址(正确地址)  " A/ ?$ l4 ?  U% z( c8 q; s
  521. u8 PS_HandShake(u32 *PS_Addr)
    , D1 A# f" j% J; Z, r/ i5 J
  522. {  
    " i0 v- h; t7 ^; {+ m6 ^9 T
  523.   SendHead();
    9 G9 w0 [5 |: Z) |: a' K2 g
  524.   SendAddr();' O, s2 G% ^/ |+ E1 ]
  525.   MYUSART_SendData(0X01);
    : N: K! V) E0 J' t; s: Z
  526.   MYUSART_SendData(0X00);
      F! {; v, X! M8 u  C
  527.   MYUSART_SendData(0X00);
    0 p( f/ U! d( `( g0 u
  528.   delay_ms(200);% w: h8 i4 t2 T" b' m: h7 F! c
  529.   if(USART2_RX_STA&0X8000)//接收到数据9 F; B( c" W" A4 m7 F9 j& y, j
  530.   {   
    ) ?% q* C9 y, J
  531.     if(//判断是不是模块返回的应答包        ; C( r2 t* Y. Z4 u2 E# w! n9 P
  532.           USART2_RX_BUF[0]==0XEF
    ! [1 ]3 U! z8 T+ Q2 `% m/ F7 r) k
  533.         &&USART2_RX_BUF[1]==0X01* J8 g' ]6 I) K  l5 t  G
  534.         &&USART2_RX_BUF[6]==0X07
    & y0 U% I& t  t( |3 j) B
  535.       )
    * d$ i' Y) C7 e$ u# g
  536.       {
    / h& O) m: j+ ?: y; y7 A9 S
  537.         *PS_Addr=(USART2_RX_BUF[2]<<24) + (USART2_RX_BUF[3]<<16)
    ) i% `! _0 z* Z' |
  538.                 +(USART2_RX_BUF[4]<<8) + (USART2_RX_BUF[5]);$ i4 b% p  T6 S4 k3 x" E/ w0 }
  539.         USART2_RX_STA=0;
    # L1 N6 @$ U5 `4 q6 H# c
  540.         return 0;" P+ {4 j$ @7 U
  541.       }0 x$ u+ D6 I- d/ _! n) J
  542.     USART2_RX_STA=0;         
    0 `4 r" M, |- ^1 w; T
  543.   }6 X" w8 F0 f& x5 @6 Z
  544.   return 1;    . u1 ^" C' H6 |4 R
  545. }
    - c! a  ^. ^% }8 {8 `% p
  546. //模块应答包确认码信息解析  B* v' j8 }: ~& L
  547. //功能:解析确认码错误信息返回信息8 [# N8 v+ v3 I0 v1 z2 J% q1 @
  548. //参数: ensure! e' F, H- \1 h
  549. const char *EnsureMessage(u8 ensure)
    1 u; _5 p6 |5 C: Z4 w! m
  550. {  `% Y2 O4 j- L" c, i, Q  H
  551.   const char *p;
    7 H; L; a4 H/ ~6 L) A2 H7 \
  552.   switch(ensure)
      m% w' Y  o" S2 v/ Y, N# E
  553.   {( C4 V* J3 Q7 W( [+ u6 B7 Q
  554.     case  0x00:
    + c) J! K& n$ f. d
  555.       p="OK";break;   
    4 y3 v/ M) j2 G
  556.     case  0x01:
      O. M" d0 S1 w4 s) p
  557.       p="数据包接收错误";break;- k2 p$ Q7 P2 U) |8 K' [! c
  558.     case  0x02:8 R1 ]% w1 Y) m- O1 o9 h
  559.       p="传感器上没有手指";break;6 k) f/ _6 X  O+ Z
  560.     case  0x03:
    4 y! w& F0 x  M
  561.       p="录入指纹图像失败";break;7 S+ D. V" d8 V* U' @7 e. R; p4 e
  562.     case  0x04:8 M7 Z/ @! `" v# g
  563.       p="指纹图像太干、太淡而生不成特征";break;8 k; u" H( O+ x, z
  564.     case  0x05:
    " d' w: ?" w3 L
  565.       p="指纹图像太湿、太糊而生不成特征";break;
    ! U! J. b& ^/ @( ^
  566.     case  0x06:
    9 L7 M# p4 x! Z1 {6 Q4 b) E$ m, q$ r6 n  \
  567.       p="指纹图像太乱而生不成特征";break;1 X2 y. I+ C5 d3 h6 L
  568.     case  0x07:3 d" T$ B/ |- G' g: c7 x5 ~
  569.       p="指纹图像正常,但特征点太少(或面积太小)而生不成特征";break;
    ) x2 [$ G" p5 R5 H; p9 a  y1 H# Q+ k
  570.     case  0x08:2 h; B% v/ G5 E
  571.       p="指纹不匹配";break;! S" x+ g: x% [, b5 b9 N5 z
  572.     case  0x09:
    + q  Q1 `% O6 ?8 ^! x' E" y+ k
  573.       p="没搜索到指纹";break;
    8 @) v/ P/ n: `$ C6 J% v2 H
  574.     case  0x0a:5 c* J! _- f. f5 q% O5 ^7 t- X
  575.       p="特征合并失败";break;
    " V) t6 }+ _! |% ?) e9 x& Q  f
  576.     case  0x0b:& d4 M) _- {8 F( _8 A3 m/ \0 h; k) g
  577.       p="访问指纹库时地址序号超出指纹库范围";; l6 E0 B7 c+ G  T/ Q9 T. @0 J8 @
  578.     case  0x10:
    % Y% M$ a, I* `* ?  q8 _7 \" m/ d
  579.       p="删除模板失败";break;  t* c+ m2 h' p" v9 d9 p2 _
  580.     case  0x11:. ~5 q" p5 Q) f8 y
  581.       p="清空指纹库失败";break;  ) P3 E2 m, h; [, \
  582.     case  0x15:$ Q: R/ `! q4 m  ^7 I' S
  583.       p="缓冲区内没有有效原始图而生不成图像";break;5 Q. b( y: h8 M8 d8 L% D# c
  584.     case  0x18:4 x4 G: J3 A2 E& K# @
  585.       p="读写 FLASH 出错";break;: R! k$ s! C+ B& J
  586.     case  0x19:. J8 K, P# ~1 u# s% \+ }, F
  587.       p="未定义错误";break;" C! z. u5 Y: D; N( }
  588.     case  0x1a:
    $ a) H/ [& l0 L  _+ ~
  589.       p="无效寄存器号";break;
    * t7 A" e$ U6 x  r3 G0 p, T
  590.     case  0x1b:, _8 M! t* f& G: J4 w% X, e  X5 S
  591.       p="寄存器设定内容错误";break;
    * e* r5 u9 ]* C
  592.     case  0x1c:6 R# G, R+ V: Y0 L
  593.       p="记事本页码指定错误";break;
    / v' y, h& R) ^, U
  594.     case  0x1f:$ t( E5 d+ A; }1 U$ J6 [2 o' f
  595.       p="指纹库满";break;& C1 L8 U- n1 [( q
  596.     case  0x20:
    ( a0 `- H4 D  c9 R2 t3 c, G+ Z$ J
  597.       p="地址错误";break;
    ( h! |+ E$ P! T. c0 c2 A
  598.     default :
    * g/ N7 c! M  _0 K8 S
  599.       p="模块返回确认码有误";break;
    - W& l7 J. z# ~
  600.   }8 k. _' P7 V; L2 X* o8 ~: t
  601. return p;  4 p% i$ m* ]( G* u) ?4 S, g" U
  602. }
复制代码

% K% [0 ]4 c+ k- Q, U刷指纹
) O/ X+ Q* d" }, q" G4 ], ~
  1. void press_FR(void)
    1 H) |2 Z* R1 [2 D8 s5 C% j
  2. {( B- _2 ~/ o5 Y% y; z/ I7 E
  3.   SearchResult seach;
    7 |1 @- _9 E+ H1 F6 h: @- r& [+ B# e
  4.   u8 ensure;0 |" X  d# p6 r# |8 V
  5.   ensure=PS_GetImage();6 Y& H# l' c4 Y/ {/ a+ j
  6.   if(ensure==0x00)//获取图像成功 ! \7 P- X, Q% q( D3 W/ \, j
  7.   {  & f- H  L5 c+ j# G2 D& ~( `
  8.     ensure=PS_GenChar(CharBuffer1);
    ; H! D, p9 k2 ^8 n" d8 u
  9.     if(ensure==0x00) //生成特征成功/ E$ x/ w9 n' f/ G1 d6 H
  10.     {    4 ?9 H1 X9 s" _8 S, U
  11.       ensure=PS_HighSpeedSearch(CharBuffer1,0,300,&seach);# E' X% ^& C* g
  12.       if(ensure==0x00)//搜索成功9 p" A! @4 E" r6 J2 S& k; ?& u: Y
  13.       {        
    1 L$ l+ L% g" K* [9 u
  14.         printf("search the fingerprint successfully\n");//搜索指纹成功        % G" f' D# S9 K3 V
  15.       
    ) |0 ^7 d% [$ p) q$ r: M
  16.         printf("Match ID:%d  Match score:%d\n",seach.pageID,seach.mathscore);//显示匹配指纹的ID和分数8 q2 R; W: `+ x% G' m! ^- _! k) `
  17.         
    4 \- ~' D+ O; y, ^8 o
  18.         
    % G7 C$ ^' |+ j6 `: @
  19.         if(seach.pageID==0)
    : i5 Q' D- M# G! \2 N, I
  20.           LED=0;. s, Z, B7 q; Y
  21.       }+ ^/ M( K* O( T, [
  22.       else
    / {4 i9 q; A* k6 B+ g% r, @
  23.       {
      K: C; G; `* B( k7 m
  24.         printf("%c",ensure);   
    7 q6 S; d7 K8 ^
  25.           LED=1;4 i* ?! T# F8 R1 L( Q
  26.       }        
    * u7 j& a8 p5 p' D
  27.     }
    " y* @* X) L6 a5 Q- x
  28.     else& l3 L5 P! i" @# b0 W
  29.       printf("%c",ensure);
    3 `7 r6 C+ ?' E/ }+ J" o9 Q# d
  30.    delay_ms(1000);//延时后清除显示- t: P# V2 b5 `! I) K  x: c
  31.    printf("\n");6 @0 C( a3 {9 d7 y
  32.   }
    4 w( R& P7 M" z3 i' \* U
  33.    
    4 B6 z8 \- W8 m- i. R
  34. }
复制代码

+ M, @  `: k' {4 c$ l5 s% B" J
录入指纹
  m" D- i( }9 g4 i: f/ s1 }" l4 c
  1. void Add_FR(void)* g/ E6 n  _/ ^; y7 C
  2. {
    3 M; ?, S: A( o; L: e
  3.   u8 i=0,ensure ,processnum=0;- @9 d0 n/ m& k% {% l
  4.   u16 ID;4 L; K* o' i( [( {' h/ y  [( U
  5.   while(1)
    . S) s; W5 J- N% B  A
  6.   {
    4 ~6 m) N) e8 k5 A+ @  D
  7.     switch (processnum)# S2 p$ [0 a' g" T3 ?: x
  8.     {
    ) j- J4 y2 a* \+ ?
  9.       case 0:
    - R, m3 c' c  r" M4 O( t0 B
  10.         i++;
    4 W) S3 H% I' u
  11.         printf("please finger\n");   //请按手指
    $ S; N4 P& u* z( {4 X
  12.         ensure=PS_GetImage();//录入图像返回字
    8 T- b* k4 h: }! E( F# |# I3 Y
  13.         if(ensure==0x00)
    . x- F' I# ~* r$ d' B4 k
  14.         {
    0 L0 t) M  J) q
  15.           ensure=PS_GenChar(CharBuffer1);//生成特征
    8 l4 e/ J" A( u
  16.           if(ensure==0x00)
    0 k+ e" ^1 E$ f- b; k
  17.           {& U: P+ \; D9 F+ Z5 ~; b" {
  18.             printf("zhengque\n");//指纹正确( k# f4 Y& Q; u8 z9 w' l
  19.             i=0;
    . ]( r4 C. t* |' z# U  e3 I' G
  20.             processnum=1;//跳到第二步            
    . g) f( l4 l, D, G( F0 L
  21.           }
    3 `" a8 [2 F, o$ S2 k- {
  22.           else printf("%c\n",ensure);          5 W( ?$ n5 O5 h) f8 \! [) z
  23.         }. n; r4 v2 H0 t" W! w" n
  24.         else  printf("%c\n",ensure);            + q7 T1 f" M+ {: d
  25.         break;
    : z- t, t% T$ X1 N1 Q4 n8 {7 }
  26.       
    ( V7 |8 h- _5 K2 f* }! r$ B/ \
  27.       case 1:3 I  V) ]" z0 g* i; u8 U- T
  28.         i++;9 ]/ m; O- g  ]) ]
  29.          printf("please click on the finger\n");//再按一次手指
    5 X6 E/ d# T  e/ c& {6 r& P
  30.         ensure=PS_GetImage();) ~) ~+ ^" a1 `- O/ f3 Q
  31.         if(ensure==0x00)
    ; f7 g4 P% ?* o& h1 G  y3 k
  32.         {
    4 N$ V7 Z& z2 X% r' L6 t3 ^/ @3 f
  33.           ensure=PS_GenChar(CharBuffer2);//生成特征      
    / ?8 t- Z" [6 s5 {' Q) @
  34.           if(ensure==0x00)- X3 P0 j5 H# a- m
  35.           {
    6 j, g8 s) L' Z* Q+ s( Y4 f' l- L
  36.             printf("Fingerprint right\n");//指纹正确1 x3 w4 I$ O* _/ @; c" n( H8 d/ w1 m
  37.             i=0;
    9 y% s2 X2 m2 ~; Z4 p# |
  38.             processnum=2;//跳到第三步$ M0 H$ {5 @/ ~: }" K& [
  39.           }else
    3 r3 O9 Z/ _4 i# U# ?) R0 ^8 }
  40.           printf("%c",ensure);  0 D' p' C6 K' }6 C. V
  41.         }else 2 s1 [. {. X9 M) b9 X& T0 B8 ?  s( h
  42.         printf("%c",ensure);    - @6 l. c$ Y9 G
  43.         break;
    , _9 }  L% r0 d% a0 d; ^) A
  44.       case 2:3 S/ ]' p$ y' r$ S$ i
  45.         printf("comparing two fingerprints\n");   //对比两次指纹9 y, O4 u( k' n) s
  46.         ensure=PS_Match();//精确比对两枚指纹特征返回字
    6 [5 a& ~# ]9 H8 \/ a
  47.         if(ensure==0x00) ( O' {) X# N/ U/ M
  48.         {6 z# o6 R( ?8 q; y5 K( w
  49.           printf("Two fingerprints is the same\n");//两次指纹是一样的! y/ x* G, h  Q' V
  50.           processnum=3;//跳到第四步: I2 d: l  X- H8 o' t; [. N
  51.         }
    - g4 s3 o3 g( J, r
  52.         else
    $ |" E. C8 F4 S0 u& P3 j  [
  53.         {2 b5 F: y  p+ `9 k2 J
  54.           printf("Comeparative failure,please press fingers again\n");//对比失败,请重新按手指
    1 ?! O: x" t7 l8 @6 n2 w
  55.           printf("%c",ensure);
    ( ~6 W8 T* a0 ?: H. I
  56.           i=0;( z1 i/ I0 ~& q5 t& f
  57.           processnum=0;//跳回第一步   
    0 p0 y$ E8 ^/ Z  A4 G
  58.         }" c2 l3 D9 n  x: S6 T+ ?
  59.         delay_ms(1000);
    - K$ @$ u  D& u$ Z
  60.         break;! ?: p- h5 n) g0 \$ S7 e
  61.       case 3:
    . A! d5 y3 c! v+ e
  62.         printf("generate a fingerprint template\n");//产生一个指纹模板* e+ F4 S' r3 C9 X+ W
  63.         ensure=PS_RegModel();
    ; E% P3 b; m/ x( Q' [! X  i
  64.         if(ensure==0x00)
    3 [1 M# k9 S9 r0 p& [% D
  65.         {
    8 b: z) n0 k" P
  66.           printf("generate a fingerprint template is successful\n");//生成指纹模板成功' w8 m! g9 L. Q& u9 k5 k; V& L& i
  67.           processnum=4;//跳到第五步
    * {0 `- }5 L: J0 e* q& m  p/ U3 v. m
  68.         }else {processnum=0;printf("%c",ensure);}
    ( f" @; V3 q& I, t
  69.         delay_ms(1000);5 S5 A& r, T6 i" s  z* \
  70.         break;( W9 g% S: q/ U4 r/ d# {
  71.         : g% [  ^4 B) r
  72.       case 4:  
    ( _1 i4 V4 L# F
  73.         printf("input the ID and press Enter to save\n");//输入ID并按“Enter”保存
    5 |3 b( t5 t( `) S6 Q( G) e" s7 ?% P8 f! W
  74.         printf("0=< ID <=299\n");  
    7 x) J3 g8 K! k. I" B: }# _
  75.         do) f- ]& V  p! ^* Z' ~  \1 w
  76.             y! M# G6 Q' s; Y3 n( f* A
  77.         {- p% g+ O& c* K# F: U3 k# _
  78.           ID++;
    $ J( U- p, Q% b: Z0 d
  79.         }; ~, B7 S& _1 b$ K/ y/ Q' @
  80.         while(!(ID<300));//输入DI必须小于300
    & A6 w5 v: [: D/ ^2 Z+ B5 _" H6 b
  81.         ensure=PS_StoreChar(CharBuffer2,ID);//储存模板
    5 s1 K' w# U5 r
  82.         if(ensure==0x00)
    2 X3 P0 T/ k* ~0 f1 m0 E
  83.         {      
    4 k1 J. J% ?' o7 X% ^9 g6 _
  84.           printf("Add the fingerprint successfully\n");//添加指纹成功3 h8 h/ {& R- q$ v/ Z; W$ a% g
  85.           PS_ValidTempleteNum(&ValidN);//读库指纹个数
    . L4 |' f, M7 O$ g; Q: K
  86.         
      m1 X% r5 N5 V+ ^
  87.           printf("%d\n",AS608Para.PS_max-ValidN);//显示剩余指纹个数
    , J" s. V2 |' |5 g( X8 g
  88.           delay_ms(1500);//延时后清除显示  
    % f) {' e4 w" x2 B0 o
  89.           printf ("\n");3 k- k4 ~; x, \9 Y8 M
  90.           return ;6 p' E8 I7 L3 [4 v
  91.         }else {processnum=0; printf("%c\n",ensure);}         
    & g6 p( G& N  C
  92.         break;        1 ]5 f4 ]  M) q2 e1 ?
  93.     }
    1 L! }9 b! T$ Z( p  ^+ |& y8 h6 t
  94.     delay_ms(800);
    % G8 V/ \% B1 `; L5 _% E
  95.     if(i==5)//超过5次没有按手指则退出- q5 p8 W5 H) n  ^
  96.     {& V  C" M6 z, q  x) n
  97.       printf("\n");
    7 d5 v% g0 k: m2 O2 ~6 Q
  98.       break;  
      m! C. p) h( M" [- a, Z' i
  99.     }        
    + W8 M* ?4 X( F: ^7 j7 A$ h
  100.   }
    9 }4 E$ P3 G4 w; ^2 l% P
  101. }
复制代码
$ p+ x* T: d0 C2 w- u9 _
转载自: 跋扈洋

2 f  s- r4 G  ?, V* j' s
收藏 评论0 发布时间:2022-11-29 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

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