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

STM32指纹识别

[复制链接]
STMCU小助手 发布时间:2022-11-29 15:00
一、 简介
+ R4 m$ }; M5 M9 `1 k

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


: O: E3 e) c' L' w- k3 @

三、 AS608模块引脚描述

Vi 模块电源正输入端。! B. ]- [! I: j3 o6 h1 K
Tx 串行数据输出。TTL 逻辑电平
, s9 f: U) D1 q0 x7 [( g3 QRx 串行数据输入。TTL 逻辑电平6 n+ O  t! K+ E9 l3 y. i
GND 信号地。内部与电源地连接
1 m3 W# U, X/ F7 Q( n, `  n# HWAK 感应信号输出,默认高电平有效
( j" A2 `7 ]# ]3 \(用户可读取状态引脚(WAK)判断有无手指按下)& E5 C$ f" z% l* e" Q! }# q
Vt 触摸感应电源输入端,.3v 供电6 L7 H* }- Y$ W: U: e8 E% e: ]
U+ USB D+9 I9 B- U9 x0 [7 Q
U- USB D-


) |( X8 S" ~4 j. R

四、开发流程

640 (1).png


/ T; w% q8 `* U" B% f

. m  {5 l* `$ M9 k
640.png


& h: `/ w* l! L7 X# [- R1 Q/ h1 i程序2 ?. Y/ Q2 Q  [7 C6 `0 k
AS608.H) ?8 ^- H5 Q. v3 N% {" V
  1. #ifndef __AS608_H: V. e# \6 [: {3 g# @% Y
  2.   #define __AS608_H( h4 u3 S0 D5 z- e, Q* U5 Q7 t
  3.   #include <stdio.h>. H% [; N" f% ^
  4.   #include "stm32f10x.h"
    ' U0 ]( |- W+ v
  5.   #define AS608_USER     18 p& C  U0 o" v4 }
  6.   #define PS_Sta   PAin(6)//读指纹模块状态引脚6 B: j8 a) a2 D! ^. T5 u$ L
  7.   #define CharBuffer1 0x01# b6 _; c. i# s3 v
  8.   #define CharBuffer2 0x02* R3 N1 L( l5 a5 e; e& ~! w
  9.   
    & @8 C! L' `+ |
  10.   extern u32 AS608Addr;//模块地址. [. w% g7 l* s9 m' ]
  11. 6 y9 y, j) ~2 D+ m
  12.   typedef struct  + u- a. }8 `# X4 a* j$ F
  13.   {4 T6 M/ Z5 l  d& i
  14.     u16 pageID;//指纹ID
    . @' z( S, A7 p
  15.     u16 mathscore;//匹配得分( C/ Q8 p! K, s9 C
  16. }SearchResult;
    " i8 x6 Y3 c, g+ p, v4 b* l
  17.   typedef struct$ Z& `7 _/ B. w# ~9 U  |1 @* {0 q, t
  18.   {: a! h: U- O4 f# r" w
  19.     u16 PS_max;//指纹最大容量( v! o' F  M1 |$ v" N
  20.     u8  PS_level;//安全等级
    ) ~; V' W! O; I5 ^
  21.   u32 PS_addr;
    ; c* \; Q% z( k9 a: \+ S" u0 D* x" @
  22.     u8  PS_size;//通讯数据包大小  {2 ^6 x# z: F! |& t' b  _% c- W
  23.     u8  PS_N;//波特率基数N
    " ?# g) f( g/ ~/ A4 i
  24. }SysPara;) Q1 n8 L. g4 v
  25.   void PS_StaGPIO_Init(void);//初始化PA6读状态引脚# P) ]9 u: l4 C, d* R4 U
  26.   u8 PS_GetImage(void); //录入图像
    # @+ X: B  B/ m( D9 G
  27.   u8 PS_GenChar(u8 BufferID);//生成特征
    3 ?; @( k3 {- Y1 z+ D, J) V0 C
  28.   u8 PS_Match(void);//精确比对两枚指纹特征
    % X/ a. {; ]! k2 R4 _2 d9 ?
  29.   u8 PS_Search(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p);//搜索指纹
    + v2 |9 ], C, P" T
  30.   u8 PS_RegModel(void);//合并特征(生成模板) " [# K# R0 g  {4 W4 L
  31.    & |- l( }$ W3 T0 P: l) E' p
  32.   u8 PS_StoreChar(u8 BufferID,u16 PageID);//储存模板 ( h+ d2 G2 E" z$ o' r
  33.   u8 PS_DeletChar(u16 PageID,u16 N);//删除模板 % J7 \3 c: V, h8 ?6 P- N
  34. u8 PS_Empty(void);//清空指纹库
    # K# }! ^* k8 ]! g0 p

  35. * @( Z- R$ r0 S( B- _0 B
  36.   u8 PS_WriteReg(u8 RegNum,u8 DATA);//写系统寄存器
    * p* {) a' `' l; d( w

  37. 2 Q' V; X8 \: j# J) M. l6 I
  38.   u8 PS_ReadSysPara(SysPara *p); //读系统基本参数
    4 N6 b3 l; g3 b2 c( q. [7 q
  39. " A2 A" h4 T) u' A4 ^3 h
  40.   u8 PS_SetAddr(u32 addr);  //设置模块地址 0 t+ F; Y# T+ J2 o
  41.   " i9 T! ^, v) ]# j1 i2 ]. L
  42.   u8 PS_WriteNotepad(u8 NotePageNum,u8 *content);//写记事本 4 Z; P- ~, G3 J# Y

  43.   Y9 o, p2 J2 U7 g
  44. u8 PS_ReadNotepad(u8 NotePageNum,u8 *note);//读记事 ' h2 i" M/ q! G3 O& R
  45.   
    6 J# T8 [0 m; L, u
  46.   u8 PS_HighSpeedSearch(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p);//高速搜索 * n% e5 a, ~6 Q+ N
  47.    
    9 G, v+ ^& P# x5 N4 X) P
  48.   u8 PS_ValidTempleteNum(u16 *ValidN);//读有效模板个数 8 w7 v! y' D: }  Z
  49.   8 V1 o+ B& Z+ |) l8 s* E' r
  50.   u8 PS_HandShake(u32 *PS_Addr); //与AS608模块握手
    " x# p' s8 E) p$ }7 V+ H) v
  51.   
    $ i% ?) p% E: x% G8 p$ Q- x
  52.   const char *EnsureMessage(u8 ensure);//确认码错误信息解析8 h) S% M) {5 O4 w3 p
  53.   
    & U$ b) A8 o+ |% k
  54.   #endif
复制代码
8 F2 |9 j$ d7 o9 q9 Y$ {3 r
AS608.C

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

% Y9 ]8 t5 t6 ]8 B$ o刷指纹
$ p) n6 r4 N+ }3 U5 }( ?
  1. void press_FR(void)- Z- Z1 u, n+ K1 I/ F3 d
  2. {  M" O2 I" t/ u, p, v( q- d* n5 k
  3.   SearchResult seach;
    + o! P( @" i5 w$ b7 h7 A7 u6 V9 j
  4.   u8 ensure;
    # H0 D8 ^& x1 p# o( o% A  u0 ~
  5.   ensure=PS_GetImage();1 A2 t  k" C* U0 Y# U; l
  6.   if(ensure==0x00)//获取图像成功
    ( G0 h4 j& i& i+ S0 n4 r0 b
  7.   {  
      u7 O7 Z2 s) [
  8.     ensure=PS_GenChar(CharBuffer1);
    & x5 g+ c6 a: l  z2 R% N
  9.     if(ensure==0x00) //生成特征成功
    7 \; V" x6 v5 j7 |3 Q; \
  10.     {    % s$ _1 n1 d8 F, d5 d
  11.       ensure=PS_HighSpeedSearch(CharBuffer1,0,300,&seach);
    ' i  r  o' p+ P3 F
  12.       if(ensure==0x00)//搜索成功! }6 I9 T: s5 H$ d& A8 y4 c. O
  13.       {        8 L; {, p2 P/ V, ^% @+ S/ o5 A3 _
  14.         printf("search the fingerprint successfully\n");//搜索指纹成功        
      P7 x$ |2 G; o' q" N  R
  15.       
    . o9 @& o, k- _# f2 G  t4 O
  16.         printf("Match ID:%d  Match score:%d\n",seach.pageID,seach.mathscore);//显示匹配指纹的ID和分数$ F+ J9 y( t  J" t: I9 e
  17.         % r5 c  f; L6 e; l+ C
  18.         
    / D! c0 f, J1 m
  19.         if(seach.pageID==0), e0 v! S3 ]! F5 K
  20.           LED=0;+ B. |8 R& U+ e9 ~
  21.       }, a3 R& [' y: N
  22.       else 2 J& D' A2 Z& q
  23.       {# ~, R- v9 x9 S( Z
  24.         printf("%c",ensure);   
    ( \$ n. D* Z  ^0 N7 [: \1 A
  25.           LED=1;, x4 u1 ]+ |- `3 d. }. U1 j
  26.       }        
    6 ~4 R; W6 J# _" o% N8 A/ e
  27.     }
    + l8 \; T  P7 q7 I! S4 F; N9 N
  28.     else
    3 i3 ~+ [9 T& x
  29.       printf("%c",ensure);, \' n' o  Z: Y0 \" u9 h. A0 F2 B  q
  30.    delay_ms(1000);//延时后清除显示
    5 ~5 S% |: w# V9 w/ x& ?3 A0 q1 t
  31.    printf("\n");
    1 q* M- @# n. R" c
  32.   }
    & j2 \! s0 _+ j  |, L$ S) G* k! q; c
  33.    
    * v$ U& v5 @/ `, L+ _
  34. }
复制代码

6 ^( h8 k5 e+ w" P$ T
录入指纹# \$ G! i) G# Z! H0 o5 P( X
  1. void Add_FR(void)
    ! _: d8 L1 ~# ~) K
  2. {
    - z7 Q; e- |$ z( W% U
  3.   u8 i=0,ensure ,processnum=0;
    ' p( M5 Q0 `, P! w$ _! P
  4.   u16 ID;  X5 o& ~% I% |7 N* |9 V9 d
  5.   while(1)% a' u$ g( _" h- W# L% F9 Z
  6.   {
    6 Y) \0 X3 d$ Y8 U0 a
  7.     switch (processnum)$ y) R- ^" A" M- v
  8.     {
    ) X9 `! k+ a* i) \, l. M2 Z; ~
  9.       case 0:
    ( {: ~" D5 g( b
  10.         i++;' ?# I3 w+ m& q; r: [6 F4 D9 X
  11.         printf("please finger\n");   //请按手指$ u3 w& z4 y4 c7 k  N  f4 W
  12.         ensure=PS_GetImage();//录入图像返回字; f- _0 J; a  t. ?9 l/ Q: s9 w' b
  13.         if(ensure==0x00)
    6 I! ?% P1 z& g8 u4 l9 N# q
  14.         {: h* V7 t  T: _
  15.           ensure=PS_GenChar(CharBuffer1);//生成特征
    & s8 @. {  K6 E' {; A5 T
  16.           if(ensure==0x00), C4 `& O2 V9 q: J: J* r. M# x6 a
  17.           {$ U6 a$ P1 {* }" r! {% T# F. V1 o6 u% ]! n
  18.             printf("zhengque\n");//指纹正确
    9 P; U6 q$ [+ H! D
  19.             i=0;+ k) k- p7 H9 u" i, h( u4 h: i9 Q
  20.             processnum=1;//跳到第二步            9 h! o0 g- N2 i+ P, H4 U% ^
  21.           }& \( B/ t" R; X% y- G. P
  22.           else printf("%c\n",ensure);         
    ' D3 Y$ E9 b* ?" {' h" L' D
  23.         }
    7 j; p# [5 p2 |- \9 ~$ H" H
  24.         else  printf("%c\n",ensure);            
    : ~1 N" N, W. r8 V) W# v9 f# E. y
  25.         break;
    . D/ A$ K' d8 S! T6 I! M
  26.       2 |6 u/ ?' o" N0 h! T! _0 F
  27.       case 1:  y" U7 h7 x5 d3 W0 X
  28.         i++;
    - S; X2 L" p' z- `' D' g
  29.          printf("please click on the finger\n");//再按一次手指! p# E1 S: R# g$ w2 {, h
  30.         ensure=PS_GetImage();
    3 w% {% y- ]) Z2 Z. H; |1 N
  31.         if(ensure==0x00)
    & a; w9 ~9 D, H9 `
  32.         {
    $ J/ q6 G3 O+ R) S0 w  _
  33.           ensure=PS_GenChar(CharBuffer2);//生成特征      
    0 D" b5 ^( N' ^5 }: I$ A
  34.           if(ensure==0x00)* q# H7 n# q8 h5 v% u! A9 i3 h/ [
  35.           {
    4 e" l% U5 ]# L, v! `1 N* d
  36.             printf("Fingerprint right\n");//指纹正确1 X* s% w) m" r, E
  37.             i=0;
    * C' G3 s5 |  h6 _3 D
  38.             processnum=2;//跳到第三步2 _5 q0 ^& @3 G6 p% Y, m! H
  39.           }else
      `6 M$ n, ?, k$ i+ ~+ u( y
  40.           printf("%c",ensure);  
    8 u; ~9 P5 C4 }% w8 E4 P2 K
  41.         }else
    % F5 k8 M7 X" o: [" k
  42.         printf("%c",ensure);    $ r  _5 y& O% {  E7 U
  43.         break;( ]5 e, y7 O# B+ f( m
  44.       case 2:
    4 K+ v/ E* j) i% D; O, b
  45.         printf("comparing two fingerprints\n");   //对比两次指纹0 g. \1 |: U. u. Q0 [+ e
  46.         ensure=PS_Match();//精确比对两枚指纹特征返回字
    4 k& |" M, z7 m4 o( k
  47.         if(ensure==0x00)
    ! H# Y1 g0 ?  H/ _( `% L5 Q
  48.         {3 M% S- P! G% h8 q1 E5 N
  49.           printf("Two fingerprints is the same\n");//两次指纹是一样的9 ]; n& p7 A1 I8 {" a/ ^. O6 M" L
  50.           processnum=3;//跳到第四步# e3 ^( `, D) R5 c3 e' K
  51.         }
    ( Q8 @* m" i( x+ L+ {9 I/ j  u
  52.         else
    ; w& d! f9 |% x. [4 E$ R
  53.         {4 R( o" b3 H" K' \
  54.           printf("Comeparative failure,please press fingers again\n");//对比失败,请重新按手指* z+ R+ q2 e  k2 V# @' N0 N
  55.           printf("%c",ensure);- l$ s7 j: G2 n$ w* ~- a; O3 E
  56.           i=0;& m2 {( ~, l" o7 t$ l
  57.           processnum=0;//跳回第一步   
    ' ^% h5 N7 w' n  B/ ~" V4 d
  58.         }
    ' K& ]0 \  h  f+ B" J
  59.         delay_ms(1000);4 n0 N: b# ~$ y+ K, Q
  60.         break;
    ' i$ }% O  F/ }' f
  61.       case 3:
    6 C0 N; X: N! G9 X
  62.         printf("generate a fingerprint template\n");//产生一个指纹模板
    # s' j4 T3 ?$ C* l. j! P1 C4 ]
  63.         ensure=PS_RegModel();/ Q% }$ J% K" J! I6 G1 X
  64.         if(ensure==0x00) $ U* B, n1 T3 D- f
  65.         {+ u; l( I) ~% c4 J( N( T
  66.           printf("generate a fingerprint template is successful\n");//生成指纹模板成功
    ( W4 `5 A6 N+ L
  67.           processnum=4;//跳到第五步/ ?# d/ H( }' n! }! z$ F
  68.         }else {processnum=0;printf("%c",ensure);}
    7 A2 y7 K& {( ?2 v2 l. \
  69.         delay_ms(1000);
    % i8 r8 G, y- ?: c' A+ k
  70.         break;% Q" h/ f6 q( @: V
  71.         
    4 g# f6 r: r% B. c( V: F
  72.       case 4:  % M5 Y: J0 Z* R" \2 t
  73.         printf("input the ID and press Enter to save\n");//输入ID并按“Enter”保存
    : w$ a5 u3 }; {5 I1 g) r
  74.         printf("0=< ID <=299\n");  ( n, I  z" D1 A& P4 }0 l% r3 U3 t$ F
  75.         do3 X  y  j" ^' G0 \+ F7 t- N" b+ ?
  76.           7 T( G8 D9 E) z, X6 d- ]5 l
  77.         {7 p8 ~" o) r0 O0 V& Y
  78.           ID++;
    $ p! g  F. R' p( h. r8 b
  79.         }8 O/ a! H5 G, u+ O$ _- ~3 l. b$ e
  80.         while(!(ID<300));//输入DI必须小于300
      ~# [$ ?. i+ G! T
  81.         ensure=PS_StoreChar(CharBuffer2,ID);//储存模板  v4 U# O+ k( E9 F& H( Q- M# R5 }
  82.         if(ensure==0x00)
    " G" \; Y, R7 z: E9 h, A. `0 K* P
  83.         {      
    . D6 w8 E8 C. u1 J$ A7 m
  84.           printf("Add the fingerprint successfully\n");//添加指纹成功( U3 k  t) b& d
  85.           PS_ValidTempleteNum(&ValidN);//读库指纹个数& O/ U2 f. C, b. N% t/ ]. |: t
  86.         1 Y6 O  L6 \& o
  87.           printf("%d\n",AS608Para.PS_max-ValidN);//显示剩余指纹个数2 g- W$ C5 W' q1 Z! N# ^; }5 ^
  88.           delay_ms(1500);//延时后清除显示  
    " [/ p( F- B' _. E' c6 q
  89.           printf ("\n");1 {3 t5 Q* u9 v/ f4 G: M' c3 d
  90.           return ;
    ; v" x! L( b& o0 [; \
  91.         }else {processnum=0; printf("%c\n",ensure);}         
    + m" \$ ^( l' z- {& p0 P: Z6 o  h
  92.         break;        
    7 E/ c) T& m7 U" o/ d
  93.     }
    6 r: L  G! q& |3 a  l$ j5 U
  94.     delay_ms(800);
    0 a9 Q2 B0 Z  z- x) w
  95.     if(i==5)//超过5次没有按手指则退出+ Y& G/ P/ t+ N8 V% G: r4 ?( M
  96.     {' ?0 Y9 e. R0 \7 r. v3 g
  97.       printf("\n");6 R* l2 }0 P! j1 R. |1 B
  98.       break;  $ ^. Q) m9 a9 W( G
  99.     }        
    , \2 N1 p! }; i& D' w& O
  100.   }
    ' ?9 L- x0 l, l2 H6 \$ p
  101. }
复制代码

! J: [# b/ y0 Z6 |( `8 D7 q2 J
转载自: 跋扈洋
3 ?- k- F5 j! ^3 r. w7 q" P$ _4 Z
赞 收藏 评论0 发布时间:2022-11-29 15:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版