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

STM32指纹识别

[复制链接]
STMCU小助手 发布时间:2022-11-29 15:00
一、 简介
1 i3 Z; D  e' o: y) |& P3 f6 O

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


* [! y& ]0 Z7 |$ O! I0 s

三、 AS608模块引脚描述

Vi 模块电源正输入端。8 T9 _3 ?8 n" ^' @
Tx 串行数据输出。TTL 逻辑电平7 C2 S& c3 @9 V5 C7 J
Rx 串行数据输入。TTL 逻辑电平
" O; M7 `) w% K1 P# w* ~GND 信号地。内部与电源地连接2 w* R3 a, [, c9 I/ N1 ~
WAK 感应信号输出,默认高电平有效" Y2 O+ d/ X/ ^$ I$ I8 x) A3 K
(用户可读取状态引脚(WAK)判断有无手指按下)
3 m+ L. V4 n" K! |- {Vt 触摸感应电源输入端,.3v 供电- m9 g( j/ j" O' [
U+ USB D+- t# G1 s$ A" Z. \: X
U- USB D-


4 ^) ~$ F" ~& q) O, h6 C# x

四、开发流程

640 (1).png

; V: F8 Y" l: S4 e' I! N9 a: k


( C& D- b" N# T. ^$ F 640.png


; D; e2 k8 i( I' o- Z9 \& P程序! F& B9 X8 S5 b2 R6 ]
AS608.H* i- Q& L7 A: R* s/ @: A. }5 M* B
  1. #ifndef __AS608_H( e+ L, b4 s1 u1 e- j! M2 W4 |' ?
  2.   #define __AS608_H1 n2 h" x1 _$ J- D8 S: r
  3.   #include <stdio.h>" c) L# N- c# y  Q9 c  e
  4.   #include "stm32f10x.h"
    % n& n* O+ P6 U5 J; A2 R, o
  5.   #define AS608_USER     1
    3 G( J* ]0 k# @) ^- f( f' G
  6.   #define PS_Sta   PAin(6)//读指纹模块状态引脚
    - }9 v7 x' `0 @5 W! a
  7.   #define CharBuffer1 0x01& F: x0 p2 H4 ~  i
  8.   #define CharBuffer2 0x02, y% L7 c& f+ p# D9 H4 i
  9.   ) b5 r! i- K0 {$ B% ]3 p/ q
  10.   extern u32 AS608Addr;//模块地址
    8 n. K( W  {% [4 x0 c2 x/ t2 H
  11. / ]  F3 O' U5 @) L. i5 z: X
  12.   typedef struct  5 e  g6 J  u. ?( r- `0 k: Q  q* B
  13.   {) n0 U* i+ L) C& m0 [4 w
  14.     u16 pageID;//指纹ID
    ! O% z8 ]% ~8 x) b6 X
  15.     u16 mathscore;//匹配得分
    * F- ^% g& @  C3 M: Z
  16. }SearchResult;
    ; z  e& S8 l6 H6 o4 v' G
  17.   typedef struct
    - `0 S/ E% m  L# S3 k- b  J/ c
  18.   {+ p3 h( L3 x  U' U2 H
  19.     u16 PS_max;//指纹最大容量
    1 n9 d! Q7 I% n) W( p
  20.     u8  PS_level;//安全等级' K5 [& T. l- R0 r+ a) ^
  21.   u32 PS_addr;
    ( u: W4 \; Q. Q6 s0 \* ~
  22.     u8  PS_size;//通讯数据包大小8 t; `* J- r0 F- A& V  k
  23.     u8  PS_N;//波特率基数N& P  L1 k  t3 r  U' k9 m
  24. }SysPara;: z3 ]& m8 ^% Q( q6 r( d' W' ~
  25.   void PS_StaGPIO_Init(void);//初始化PA6读状态引脚8 j$ g* t$ e; |1 r8 r6 R0 a
  26.   u8 PS_GetImage(void); //录入图像
    $ L7 ?) B5 J2 d' b& Q* d2 l/ u. w
  27.   u8 PS_GenChar(u8 BufferID);//生成特征
    2 M: ^" q$ l0 k5 Y" N
  28.   u8 PS_Match(void);//精确比对两枚指纹特征 ( j8 ~. x& x2 z$ d. H
  29.   u8 PS_Search(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p);//搜索指纹
    ! s* ^/ d( k6 @8 N
  30.   u8 PS_RegModel(void);//合并特征(生成模板) 9 O' B0 G9 M/ n+ \
  31.    
    7 T6 n9 U3 b* j& E
  32.   u8 PS_StoreChar(u8 BufferID,u16 PageID);//储存模板
    / w' g" P& d0 k; R, a/ e
  33.   u8 PS_DeletChar(u16 PageID,u16 N);//删除模板 ) ^! D# H5 j: _2 B- t3 l
  34. u8 PS_Empty(void);//清空指纹库 ; j# R# @) J6 ?0 C$ _1 _: h

  35. 1 q3 {& t- B0 ~) @
  36.   u8 PS_WriteReg(u8 RegNum,u8 DATA);//写系统寄存器 1 y' @2 P0 G! ^3 G6 W8 q5 x
  37. - p8 q3 U$ m/ M" F5 N* C
  38.   u8 PS_ReadSysPara(SysPara *p); //读系统基本参数
    6 }" M+ W! i( v& Q/ {  |# G

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

1 E  U% a$ o1 P& D. N
录入指纹# G. W5 M* n( o
  1. void Add_FR(void)
      r" l  e: v( @' |; v9 e  n
  2. {
    " ^3 I6 o% d, F% n9 J
  3.   u8 i=0,ensure ,processnum=0;/ J9 V2 ?* g9 j3 B6 h
  4.   u16 ID;
    6 T# P9 D2 \) i4 d( R' @: v
  5.   while(1)
    6 `# M0 I, q% D; N! m: Y' v: y7 I, `
  6.   {
    2 c3 K$ o9 I0 E' w' g5 ^/ K
  7.     switch (processnum)
      K, f0 G1 t& O- l/ q2 K  C
  8.     {- a5 U# F. d' K) B; j* a2 o
  9.       case 0:3 T3 `4 {5 M* e% j$ r
  10.         i++;' K" {7 [% h0 |$ T$ ], M5 O, X7 E
  11.         printf("please finger\n");   //请按手指
    : G9 Q# `0 b& V; T
  12.         ensure=PS_GetImage();//录入图像返回字6 d0 C! d' n# L% I/ G
  13.         if(ensure==0x00)
    % i) H! l" Q; ^/ ^% `8 }
  14.         {. L  m) O% @: j& ?
  15.           ensure=PS_GenChar(CharBuffer1);//生成特征
    : h1 ~8 u# e) n, ^. g0 N. I
  16.           if(ensure==0x00)
    & H' |. }' n8 k& V3 H. C
  17.           {
    6 }- x2 p2 S& H  N% ~. S- `$ z0 Y* K$ C
  18.             printf("zhengque\n");//指纹正确( t# G9 T; ], i3 R
  19.             i=0;
    $ B: L8 I6 \8 Z, q6 ?3 W+ @
  20.             processnum=1;//跳到第二步            & y1 V8 x; A7 O5 f. e
  21.           }
    : d! n6 ^# t( a& o7 b& |! |
  22.           else printf("%c\n",ensure);         
    % H6 c3 I% `! Z- B
  23.         }
    + z( h8 d. w! X+ _/ z
  24.         else  printf("%c\n",ensure);            + h, j0 c+ K7 s, w& M
  25.         break;' J2 f% \) L- m; H
  26.       
    / G2 I7 Q& C, S/ C% H, y
  27.       case 1:( ]3 A+ H# F4 V' d. d/ f) v
  28.         i++;
    " h. p! m5 v3 ?$ b- Q
  29.          printf("please click on the finger\n");//再按一次手指
    " E! p! q$ s! q4 i4 C- z
  30.         ensure=PS_GetImage();' ?$ z! [, o/ H8 ?2 |
  31.         if(ensure==0x00)
    7 P. D& Q2 I% d  E+ v, H9 F6 [
  32.         {
    / j# k- Q7 n; x) N( Y* U( ~7 N" i2 T
  33.           ensure=PS_GenChar(CharBuffer2);//生成特征      4 z! g3 X' I1 u+ t* h
  34.           if(ensure==0x00)8 c% g) E+ o2 u6 ~
  35.           {7 Z% Z* P' \8 t5 b' o7 y
  36.             printf("Fingerprint right\n");//指纹正确6 _/ }& y( N$ N( h. P% o/ r
  37.             i=0;
    1 Q7 _/ Y* B/ q3 `2 _
  38.             processnum=2;//跳到第三步3 Q( n, T( S7 [0 r
  39.           }else
    0 P; y; e7 d& x3 A, P# B& a
  40.           printf("%c",ensure);  
    , C# V0 b+ ]% k4 C% n+ S
  41.         }else
    * m3 R* R9 E$ y" L$ x  Q% Y
  42.         printf("%c",ensure);    8 L$ `5 i* V4 _. K, @1 S
  43.         break;$ Z1 b, t( _8 p
  44.       case 2:
    : D& f: ]" i$ B$ [" t1 C+ y
  45.         printf("comparing two fingerprints\n");   //对比两次指纹
    , W! y. [2 P* O' G
  46.         ensure=PS_Match();//精确比对两枚指纹特征返回字
    ' c7 ]% T& r' @7 w
  47.         if(ensure==0x00)
    ! B& D& ?. R" A
  48.         {* x) ^) e5 L$ v2 T
  49.           printf("Two fingerprints is the same\n");//两次指纹是一样的# s0 \- {( |+ u% L1 ~) ]+ F
  50.           processnum=3;//跳到第四步, S7 B( G3 m+ N1 t6 r
  51.         }
    / w6 v$ u  A4 E% _9 i3 }
  52.         else
    ! v( b* r  D3 Q5 A
  53.         {& Y5 x0 B0 {- u0 D* U5 Z* J
  54.           printf("Comeparative failure,please press fingers again\n");//对比失败,请重新按手指# \, u# q( W3 v4 u; d. t2 @
  55.           printf("%c",ensure);/ `) M+ |2 ^/ ^0 C6 [# X8 W
  56.           i=0;
      w% Y' k8 ^% q' D: P. n# M
  57.           processnum=0;//跳回第一步    8 l. Y4 o; B. X% a( j3 K4 g" K5 `% i
  58.         }* C) t0 ]' Y0 c6 n! w, }, w! R7 `
  59.         delay_ms(1000);
    ' J1 z0 G  S/ o% I. o
  60.         break;- U+ c' ~( U8 I
  61.       case 3:1 l5 J3 i# W3 |: H! e
  62.         printf("generate a fingerprint template\n");//产生一个指纹模板
    - I/ F! h% y; @( m; \* |
  63.         ensure=PS_RegModel();
    " ^3 n7 [' @: i' X- R; v* r
  64.         if(ensure==0x00) + E; e( l/ w$ Q
  65.         {
    9 m- Q  F0 I' d6 e" D
  66.           printf("generate a fingerprint template is successful\n");//生成指纹模板成功8 B9 _$ Y1 u1 g( M5 d4 g
  67.           processnum=4;//跳到第五步
    * N, N/ A( J) T: a9 z$ ]* U; w% X
  68.         }else {processnum=0;printf("%c",ensure);}
    : J' \! v: S2 O& I( Z1 l
  69.         delay_ms(1000);5 S0 F) W, E0 V, w5 H. x% s) f
  70.         break;& W$ w$ |7 y0 O; }( g5 W2 [! A
  71.         
      F, b, t# `( ]. [
  72.       case 4:  
    4 Z; y8 b' O$ W6 j& R4 K
  73.         printf("input the ID and press Enter to save\n");//输入ID并按“Enter”保存$ x; r0 K' P, T
  74.         printf("0=< ID <=299\n");  6 @9 O0 O7 p) W
  75.         do
    6 X# i" c9 ]4 g" k5 e
  76.           2 m3 I' p5 Y2 o! Q4 J4 ]' w; G( W
  77.         {, r$ y' N# O: q4 g4 b% f* Q8 M
  78.           ID++;
    + c: S: p8 u7 w4 ]9 u( F
  79.         }
    # `2 u2 {' s- W' L( z/ y- L- O, E
  80.         while(!(ID<300));//输入DI必须小于3005 W* N3 s9 O) H+ j1 r0 a
  81.         ensure=PS_StoreChar(CharBuffer2,ID);//储存模板5 @3 b( m' w' I; O
  82.         if(ensure==0x00) 7 V% w* B1 \. U
  83.         {      
    - R7 q, O0 |" [1 x2 `
  84.           printf("Add the fingerprint successfully\n");//添加指纹成功
    1 \8 n# ^+ t! \% ^# B
  85.           PS_ValidTempleteNum(&ValidN);//读库指纹个数4 H6 i8 d; [" u: ?
  86.         
    - i' r; u0 t( j6 ~& X. m
  87.           printf("%d\n",AS608Para.PS_max-ValidN);//显示剩余指纹个数
    4 W4 y, p9 S2 e8 x
  88.           delay_ms(1500);//延时后清除显示  
    : M+ O# K5 Y4 Y  T
  89.           printf ("\n");
    " @( e7 y9 @3 H2 z
  90.           return ;
    0 n+ R# o" E1 w; j% ~& I
  91.         }else {processnum=0; printf("%c\n",ensure);}         
    2 z$ P2 M) i9 t' p
  92.         break;        . k  U6 `& h7 H+ C5 X
  93.     }
    0 C: [3 E$ E0 O2 U' T0 t! b
  94.     delay_ms(800);
    8 `: F; n" D2 s5 m5 I* @+ C
  95.     if(i==5)//超过5次没有按手指则退出2 v7 T* R8 `- }8 Z. s
  96.     {
    ( o7 T1 K  N1 U& j7 Z! y
  97.       printf("\n");7 b/ ~  D: w" U3 h. \) `
  98.       break;  
    & e: ]6 d( S' }) e
  99.     }        % M2 g3 z! m5 G% W5 A% M) z
  100.   }
    2 p5 G* @) ~5 ?1 z0 {
  101. }
复制代码
1 @4 H/ i, }2 G! H, D/ J5 c' g
转载自: 跋扈洋
' S1 |& ?& s8 g- p1 X0 L
收藏 评论0 发布时间:2022-11-29 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

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