一、 简介
+ R4 m$ }; M5 M9 `1 kAS608 指纹识别模块主要是指采用了杭州晟元芯片技术有限公司(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 四、开发流程
/ T; w% q8 `* U" B% f. m {5 l* `$ M9 k
& 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
- #ifndef __AS608_H: V. e# \6 [: {3 g# @% Y
- #define __AS608_H( h4 u3 S0 D5 z- e, Q* U5 Q7 t
- #include <stdio.h>. H% [; N" f% ^
- #include "stm32f10x.h"
' U0 ]( |- W+ v - #define AS608_USER 18 p& C U0 o" v4 }
- #define PS_Sta PAin(6)//读指纹模块状态引脚6 B: j8 a) a2 D! ^. T5 u$ L
- #define CharBuffer1 0x01# b6 _; c. i# s3 v
- #define CharBuffer2 0x02* R3 N1 L( l5 a5 e; e& ~! w
-
& @8 C! L' `+ | - extern u32 AS608Addr;//模块地址. [. w% g7 l* s9 m' ]
- 6 y9 y, j) ~2 D+ m
- typedef struct + u- a. }8 `# X4 a* j$ F
- {4 T6 M/ Z5 l d& i
- u16 pageID;//指纹ID
. @' z( S, A7 p - u16 mathscore;//匹配得分( C/ Q8 p! K, s9 C
- }SearchResult;
" i8 x6 Y3 c, g+ p, v4 b* l - typedef struct$ Z& `7 _/ B. w# ~9 U |1 @* {0 q, t
- {: a! h: U- O4 f# r" w
- u16 PS_max;//指纹最大容量( v! o' F M1 |$ v" N
- u8 PS_level;//安全等级
) ~; V' W! O; I5 ^ - u32 PS_addr;
; c* \; Q% z( k9 a: \+ S" u0 D* x" @ - u8 PS_size;//通讯数据包大小 {2 ^6 x# z: F! |& t' b _% c- W
- u8 PS_N;//波特率基数N
" ?# g) f( g/ ~/ A4 i - }SysPara;) Q1 n8 L. g4 v
- void PS_StaGPIO_Init(void);//初始化PA6读状态引脚# P) ]9 u: l4 C, d* R4 U
- u8 PS_GetImage(void); //录入图像
# @+ X: B B/ m( D9 G - u8 PS_GenChar(u8 BufferID);//生成特征
3 ?; @( k3 {- Y1 z+ D, J) V0 C - u8 PS_Match(void);//精确比对两枚指纹特征
% X/ a. {; ]! k2 R4 _2 d9 ? - u8 PS_Search(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p);//搜索指纹
+ v2 |9 ], C, P" T - u8 PS_RegModel(void);//合并特征(生成模板) " [# K# R0 g {4 W4 L
- & |- l( }$ W3 T0 P: l) E' p
- u8 PS_StoreChar(u8 BufferID,u16 PageID);//储存模板 ( h+ d2 G2 E" z$ o' r
- u8 PS_DeletChar(u16 PageID,u16 N);//删除模板 % J7 \3 c: V, h8 ?6 P- N
- u8 PS_Empty(void);//清空指纹库
# K# }! ^* k8 ]! g0 p
* @( Z- R$ r0 S( B- _0 B- u8 PS_WriteReg(u8 RegNum,u8 DATA);//写系统寄存器
* p* {) a' `' l; d( w -
2 Q' V; X8 \: j# J) M. l6 I - u8 PS_ReadSysPara(SysPara *p); //读系统基本参数
4 N6 b3 l; g3 b2 c( q. [7 q - " A2 A" h4 T) u' A4 ^3 h
- u8 PS_SetAddr(u32 addr); //设置模块地址 0 t+ F; Y# T+ J2 o
- " i9 T! ^, v) ]# j1 i2 ]. L
- u8 PS_WriteNotepad(u8 NotePageNum,u8 *content);//写记事本 4 Z; P- ~, G3 J# Y
Y9 o, p2 J2 U7 g- u8 PS_ReadNotepad(u8 NotePageNum,u8 *note);//读记事 ' h2 i" M/ q! G3 O& R
-
6 J# T8 [0 m; L, u - u8 PS_HighSpeedSearch(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p);//高速搜索 * n% e5 a, ~6 Q+ N
-
9 G, v+ ^& P# x5 N4 X) P - u8 PS_ValidTempleteNum(u16 *ValidN);//读有效模板个数 8 w7 v! y' D: } Z
- 8 V1 o+ B& Z+ |) l8 s* E' r
- u8 PS_HandShake(u32 *PS_Addr); //与AS608模块握手
" x# p' s8 E) p$ }7 V+ H) v -
$ i% ?) p% E: x% G8 p$ Q- x - const char *EnsureMessage(u8 ensure);//确认码错误信息解析8 h) S% M) {5 O4 w3 p
-
& U$ b) A8 o+ |% k - #endif
复制代码 8 F2 |9 j$ d7 o9 q9 Y$ {3 r
AS608.C
) B; H, s7 w4 p* C# h, M- #include <string.h>
) J: s% _8 Y9 }6 C. c( q$ C - #include "delay.h"
( X# x# A3 A! s+ Q6 \ - #include "usart2.h"
/ n" f( [- X; T" T; p \2 ~, y - #include "as608.h"
7 L0 P* W- W! w L4 F - 2 X# Y1 m3 f, w! `
- u32 AS608Addr = 0XFFFFFFFF; //默认
4 W- x: e$ V" D& b - - o% m) H% T% T* q. d% D+ Q
- //初始化PA6为下拉输入
: ]1 ?# }8 |& x8 v - //读摸出感应状态(触摸感应时输出高电平信号)9 }% C+ }' r. R! i# p: R
- void PS_StaGPIO_Init(void)& K E+ I( w6 l1 C4 h- _
- {
. x, i7 w, z! R m7 D* g# X - RCC->APB1ENR |= 1<<2;//使能PORTA时钟/ x7 K! B6 J/ j) g# r- z
- GPIOA->CRL &=0XF0FFFFFF;//复位PA6) n8 f% Z$ h8 C9 r
- GPIOA->CRL |=0X08000000;//输入模式,默认下拉* ~9 R4 [4 Z& f' D) x
- GPIOA->ODR &=~(1<<6);//下拉/ @$ q T: A/ F
- }
' T" `+ o9 {+ @8 k! M K' ~8 D, O5 { - //串口发送一个字节
# s7 |% Y+ v# K4 { c; e - static void MYUSART_SendData(u8 data)6 ~5 o0 i4 c: e* v& [
- {
! k* _) G" X0 y" b7 I8 x' J( R - while((USART2->SR&0X40)==0);
2 I( B- O: b# ?; S% E7 ~ - USART2->DR = data;
, G& t5 X& D3 J" {( p7 i# a, [- B - }
6 N* }1 l$ h( F/ \. ?" m9 { - //发送包头
! A( w0 c# s. h3 P8 c% }$ k% J, { - static void SendHead(void)4 H. P( ^: l& N) [ P# F0 V4 G9 O
- {
o/ _) a" K& R* l3 S! O' U - MYUSART_SendData(0xEF);
5 z0 S( ]' T& E2 a7 U w# r - MYUSART_SendData(0x01);
" N E% a8 f _: u+ u+ q8 s5 q - }
/ F V0 k% d5 w9 C5 K - //发送地址. L# x* {0 S8 f5 W: J
- static void SendAddr(void)- ]4 @+ J4 l L# X3 t
- {$ p& |. }. d U6 v4 l
- MYUSART_SendData(AS608Addr>>24);
0 a! P3 Q, h5 @: ?2 \/ a - MYUSART_SendData(AS608Addr>>16);% a8 G/ B7 \- M8 l* _
- MYUSART_SendData(AS608Addr>>8);
- ~/ `, [' o- ^4 S! y' K - MYUSART_SendData(AS608Addr);
. q* J6 N* x- \ - }
$ m! v' |6 X4 m d7 w0 k/ L, e$ Z! B* h - //发送包标识,
/ T: b/ U# L4 V9 a) j2 `8 x - static void SendFlag(u8 flag)! ~7 g) c: f2 A1 o; a
- {
4 z7 m; B( q7 g/ v7 c$ ~9 E! h - MYUSART_SendData(flag);
/ y! \7 D2 b% p$ T, N - }
, q! t! |( ]4 D0 [ - //发送包长度; L4 |/ G9 Q+ V2 N# f5 i- i
- static void SendLength(int length)
2 \: ?" p! Z$ R# i; T# |1 A - {
. k6 v( W( `3 _: ~) _. r7 c2 @ - MYUSART_SendData(length>>8);% H/ Y! u5 D7 g6 z
- MYUSART_SendData(length);: e9 j s+ b3 o7 X3 C
- }4 u" y1 s. d L% i' B2 i
- //发送指令码
$ j3 x4 o4 W C2 t - static void Sendcmd(u8 cmd)
' J( v2 J2 Z# i" { - {
' D. i! e% E# A4 G+ j. d+ t - MYUSART_SendData(cmd);, x& i4 Y# Q/ C$ N: K, `
- }" i8 \- \/ V- B i7 `
- //发送校验和5 ?* e$ h3 c! _
- static void SendCheck(u16 check)
+ [( P0 u, F/ O1 T; W2 o, S - {
) V- @# L& G5 o" S$ } - MYUSART_SendData(check>>8);
- f) f8 c' ^0 g3 k z - MYUSART_SendData(check);
( }* y, R8 C* P" T8 k# k7 L8 a9 `& H - }
" z( R) f t: Q5 H! h+ U" u - //判断中断接收的数组有没有应答包
V8 K9 y$ A. p4 G6 | - //waittime为等待中断接收数据的时间(单位1ms)/ p$ Q+ Z( @+ Y# o/ e
- //返回值:数据包首地址
- I5 y' ?) B8 X) l - static u8 *JudgeStr(u16 waittime)
5 Y( ^. ]+ ?* s - {
/ z- d$ C, `$ V' T! k - char *data;
% O6 H* u9 g& g4 @ - u8 str[8];
$ Y: m6 I/ K5 Q7 | - str[0]=0xef;str[1]=0x01;str[2]=AS608Addr>>24;0 z% ]7 D* P8 K+ S- e
- str[3]=AS608Addr>>16;str[4]=AS608Addr>>8;- E$ [# V# X! l2 v% W/ @
- str[5]=AS608Addr;str[6]=0x07;str[7]='\0';
$ a S$ R* j+ s/ U* P# _ - USART2_RX_STA=0;
4 d& U% i& @, F2 [* e4 w( c: P - while(--waittime)
! S. K. }) Q: }2 n5 @9 G4 |- u - {) ]) b9 _7 G! d5 ~6 K# c
- delay_ms(1);
5 k0 o; a7 W8 K1 M% Z - if(USART2_RX_STA&0X8000)//接收到一次数据
! P9 A- ^4 Q: ` - {
, M Z$ q( P( J - USART2_RX_STA=0;! k) ?& z- d" s" R3 W
- data=strstr((const char*)USART2_RX_BUF,(const char*)str);* f$ X* Y- W9 a0 b4 r% E
- if(data)
4 [# Z- o( ^6 I - return (u8*)data;
! l0 ^. N% n& o& q* Q - }: h! r8 {3 A6 `3 [: k+ V
- }% D, s( D) ?* M8 h; w7 g# I
- return 0;
9 L2 F. r& C! d - }
8 f. |5 m4 Q, y" W2 p - //录入图像 PS_GetImage# y0 N c0 ^* b
- //功能:探测手指,探测到后录入指纹图像存于ImageBuffer。4 H9 ?! g" L: V2 [9 R+ y$ F3 F" x+ M
- //模块返回确认字
* f$ J" i& d5 B/ O) o - u8 PS_GetImage(void)1 Q6 K6 T/ w% g
- {! K6 Z, c( F: `& s, Z
- u16 temp;
9 A4 Z+ M5 H# g" O! V - u8 ensure; b8 J9 C4 Q( N7 q3 Z; W
- u8 *data;
; p7 X5 ]. D# ` - SendHead();
. N2 |1 \6 N' @; N$ A3 L. E - SendAddr();! A7 Y! X" q7 d" _/ _. e6 a h
- SendFlag(0x01);//命令包标识
* w, \- s' y$ C, j2 U4 |! g8 T - SendLength(0x03);
. A" A+ ^8 j- T& l - Sendcmd(0x01); {" T8 F5 A! o; x
- temp = 0x01+0x03+0x01;( Q! L% M/ ~& x# v: I
- SendCheck(temp);
1 m" `% T# g" Z' U5 J. p/ I - data=JudgeStr(2000);
6 ?+ Q: B, |4 }# P - if(data)" A$ l+ [6 B5 m* e; S( ^" y
- ensure=data[9];
* h% c9 Y; [5 I% D( Q7 w6 }7 M - else
+ |% N- M" b. |3 F% u+ V% l( U - ensure=0xff;
' U/ |, \! h5 d: } - return ensure;$ C, ~5 @0 T6 N6 C9 \& G L% F
- }
2 U [( u) M; C- o3 j! } - //生成特征 PS_GenChar
5 a: U! Z3 z) Z% H" h - //功能:将ImageBuffer中的原始图像生成指纹特征文件存于CharBuffer1或CharBuffer2
$ e' D8 g- B2 M9 |' R7 R - //参数:BufferID --> charBuffer1:0x01 charBuffer1:0x02 8 S, P! z0 Q! `" j/ S+ N# f
- //模块返回确认字
6 k$ b. o9 v. N - u8 PS_GenChar(u8 BufferID)
V' t8 |2 n$ G" } - {
. g/ k' G- c9 i8 t7 r - u16 temp;
1 s- D1 t( P. U4 y+ m m - u8 ensure;
3 L2 P6 {7 |: `9 ^: l# t - u8 *data;8 D2 N) G: I' `: S
- SendHead();: b3 M9 p& v& |7 n0 p8 W" a
- SendAddr();4 {- L1 B1 R& F. f5 a6 H
- SendFlag(0x01);//命令包标识
3 \, c% B1 l6 J4 T7 ?4 D9 Y - SendLength(0x04); j n4 N2 z/ Y7 Z/ z
- Sendcmd(0x02);4 {, H3 R. Z! T9 G
- MYUSART_SendData(BufferID);
/ T2 P4 h2 ^9 { - temp = 0x01+0x04+0x02+BufferID;) ^5 w# z, ?/ x7 F' ?8 z' T
- SendCheck(temp);
) R7 T- A- T* R6 ?( P( ]6 J ~ - data=JudgeStr(2000);
* G2 I# Z6 ?% U8 I - if(data)
8 Z) C$ D! W) a, O8 v- k - ensure=data[9];
0 j! J, v4 N6 C6 P9 S - else/ B1 s7 j' K' y7 p
- ensure=0xff;- C3 ~2 w2 x* Z: P( ?0 p
- return ensure;
) L. W: p8 N" @5 Q - }
/ i) x5 e5 N* G N- Q* p - //精确比对两枚指纹特征 PS_Match. {0 r: ?- M6 e) c/ q8 U2 s8 T6 s
- //功能:精确比对CharBuffer1 与CharBuffer2 中的特征文件
! |5 i6 y3 G& V2 }: n6 Z - //模块返回确认字
5 t1 y9 q: A! t! p" F3 t# J - u8 PS_Match(void)
1 A- \1 j' \0 R; ~1 o2 m. |& I - {
: D3 H9 B$ j/ d8 |! u7 U - u16 temp;
& X1 j$ ^& C/ C3 x) I( u+ B) o" K% D) T - u8 ensure;
5 j# \& {% W4 u J* J x/ F3 L - u8 *data;/ G, j9 p% g; V) X
- SendHead();
$ [3 B! _6 b! b6 Y% [0 B% l$ x2 A4 B - SendAddr();+ O$ f* a7 w) v+ h
- SendFlag(0x01);//命令包标识5 Y+ t/ y) X- A
- SendLength(0x03);$ {- y2 i5 R8 H; _
- Sendcmd(0x03);
+ V+ O9 A# L- |- Z& ]! h+ y, [ - temp = 0x01+0x03+0x03;) E( Z7 |6 r( q% @) b( l
- SendCheck(temp);
+ T* r0 d. T8 ` - data=JudgeStr(2000);
; T2 g9 X; o+ J - if(data)3 r4 v# O8 u: ]5 }
- ensure=data[9];
3 e& r7 V* P+ k/ {9 W5 o& g% r - else! N! U0 S) I! ?- a5 U
- ensure=0xff;; O7 k4 T& a# n5 \/ ]7 g2 I
- return ensure;; y3 K& w; a |& E0 |! G
- }2 b1 L7 a& H% Z; }3 R4 ^
- //搜索指纹 PS_Search0 g8 E7 F2 ~ ]8 Q
- //功能:以CharBuffer1或CharBuffer2中的特征文件搜索整个或部分指纹库.若搜索到,则返回页码。2 B* e$ N0 L7 v
- //参数: BufferID @ref CharBuffer1 CharBuffer2
( h( `- }, s9 n7 L - //说明: 模块返回确认字,页码(相配指纹模板)2 b; o# e0 O! ], n" `; c2 c& f
- u8 PS_Search(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p)
$ J1 |1 d. w9 D2 V/ _6 a- ^ - {" z1 Z% E- t$ v( b; L) ~
- u16 temp;
7 v" @ F, ?% C( ` - u8 ensure;
2 y/ [' _- W2 m# } - u8 *data;: C3 G6 M* P$ B: A* x
- SendHead();
/ m. I3 K, h7 r' g0 w$ t( K - SendAddr();
6 j3 @( B O7 M& s" N - SendFlag(0x01);//命令包标识
' L% C. j; m8 H: _5 x0 S2 |- S - SendLength(0x08);
6 r3 m& G( r, X( { E - Sendcmd(0x04);
) R/ m3 E" s' |$ p" K g - MYUSART_SendData(BufferID);
) F4 a- M. @- G# B - MYUSART_SendData(StartPage>>8);
- ^3 v4 ^, k( Q- r6 u/ G - MYUSART_SendData(StartPage);5 c' N/ w1 x: R8 P# {! y4 j5 ?* H
- MYUSART_SendData(PageNum>>8);& v0 R. c5 M" n0 v8 }4 F! E5 b
- MYUSART_SendData(PageNum);
5 _0 O( v: D4 {' ~% f& ^7 A - temp = 0x01+0x08+0x04+BufferID
7 Z* D# l: P3 [1 o4 D5 N3 ? - +(StartPage>>8)+(u8)StartPage" ~3 v: P ~; O& Z& ^- C$ V* i* f
- +(PageNum>>8)+(u8)PageNum;
( G! j: @8 I: o4 } - SendCheck(temp);
' v% w: n+ W$ ?6 ? - data=JudgeStr(2000);
: M' c$ l* ^# H9 E, | - if(data)
; D% k3 j7 s: q& X) _& J% X6 k* @ - {
/ K$ s# b+ O# @* E- ?9 p' O - ensure = data[9];; W9 `9 ]' w) X8 S1 m) m# Z
- p->pageID =(data[10]<<8)+data[11];
! a% S* L# a& ^* x - p->mathscore=(data[12]<<8)+data[13];
4 w' C% n+ l. i3 _) m5 P% l5 ^" R - }6 |* e; Z. O% P; }$ g6 e$ w# I
- else' Q2 Z: Q; |% Q7 A) r3 e
- ensure = 0xff;
4 r5 |5 T/ K2 N - return ensure;
) L: T+ r+ I; ~. F6 h; a/ ? - }
: w0 Z, Q, ^: N) b! n& m - //合并特征(生成模板)PS_RegModel
" l# G7 v7 y& [. e5 m - //功能:将CharBuffer1与CharBuffer2中的特征文件合并生成 模板,结果存于CharBuffer1与CharBuffer2 3 T: W/ R# i, n" [( d+ y
- //说明: 模块返回确认字
/ x0 B8 d9 {7 Z! w* k% B4 K - u8 PS_RegModel(void)7 Z8 n D& B. Q4 O* x( e
- {; n5 e* o# b! e! b: r
- u16 temp;% |9 J( o, J: F w
- u8 ensure;& Y" T& X3 d9 Y$ |2 o. D& N4 W2 U
- u8 *data;
: o$ r% E$ n/ p8 d+ O1 [ - SendHead();$ v& E. X* ^" Y7 S+ B7 D( q* _
- SendAddr();7 h: L3 Z9 k5 ~8 }
- SendFlag(0x01);//命令包标识
. Z" ~( o* @) f$ _2 B2 _, a2 f - SendLength(0x03);% W( s/ E" p: L6 t( [ @
- Sendcmd(0x05);: t, k p6 J) ?
- temp = 0x01+0x03+0x05;6 _. ~: z+ I. v% |6 I
- SendCheck(temp);
' j, n! X; f1 k8 l& N, _& N - data=JudgeStr(2000);0 b; R4 N3 j5 _3 P1 V$ a
- if(data)
. t# @7 a* o+ U x - ensure=data[9];
# O; d* _; N; G. }$ z1 w$ C - else8 P' n9 N b% r) o& p% i/ [
- ensure=0xff;
( d- i4 V6 }# }$ K - return ensure; % T3 @" l7 c: o* c$ b
- }
& J8 i5 L8 b0 Z/ ]& Y7 [ - //储存模板 PS_StoreChar
5 X, [6 {! @3 D1 k1 M3 y - //功能:将 CharBuffer1 或 CharBuffer2 中的模板文件存到 PageID 号flash数据库位置。
% H! R4 G; L3 {* [9 b5 R - //参数: BufferID @ref charBuffer1:0x01 charBuffer1:0x02$ r9 i4 M; s+ @" V. L
- // PageID(指纹库位置号)
3 Y4 q# r8 A0 Q6 }; S+ e - //说明: 模块返回确认字
( }; M& ?6 b! V1 }1 b$ i - u8 PS_StoreChar(u8 BufferID,u16 PageID)1 R0 g0 V( g5 B. M3 C+ @9 F( M
- {
: T$ }! h2 z5 ^6 k; C - u16 temp;
/ L2 V" T9 z1 B# ^1 G4 E. z; ^$ v - u8 ensure;8 f& @ P8 J3 N; j
- u8 *data;8 F+ p3 e, }; h+ {5 H4 i- z
- SendHead();! M+ f; o9 f. d! |' N
- SendAddr();
- A1 w) y( M- t/ l4 F% o k6 @ - SendFlag(0x01);//命令包标识
0 R0 N2 K; Q% W - SendLength(0x06);: P& E" F2 G7 Q( H- F4 v7 r! ~
- Sendcmd(0x06);
" {) M: P% A5 M+ V& B8 n& | - MYUSART_SendData(BufferID);
8 _4 C/ P) G6 S8 W# u/ k - MYUSART_SendData(PageID>>8);
" f8 G- F; a2 u. ^( K - MYUSART_SendData(PageID);
3 B7 J ~ Y' c1 b - temp = 0x01+0x06+0x06+BufferID
3 W( |! C$ O9 N( ]9 W$ b6 G - +(PageID>>8)+(u8)PageID;$ D( \/ y+ q- K- \" c% ~
- SendCheck(temp);7 D1 s- a1 m" ?# B8 v. x* _
- data=JudgeStr(2000);
1 w' M8 B p6 d5 T* |& u+ x" C - if(data)
7 J3 B) L2 m* Q. {: S$ W) i0 y - ensure=data[9];
, p, U8 x0 X6 m( o W - else
# D) R3 k8 P& ~4 z6 S - ensure=0xff;
. r7 Z" g- ~) W4 _9 ]0 H g* L - return ensure;
) P- Y( Z- F& h& |2 y* f - }& O" v' U; Z! ~& @) c4 K
- //删除模板 PS_DeletChar* E# y& t' L" P( k8 D2 @2 O) V
- //功能: 删除flash数据库中指定ID号开始的N个指纹模板! r. A' ]6 l3 C. F4 v# T% i
- //参数: PageID(指纹库模板号),N删除的模板个数。% d$ f9 F6 A" _7 G) E8 p
- //说明: 模块返回确认字
$ e5 G2 T7 m$ J - u8 PS_DeletChar(u16 PageID,u16 N)0 D" \% ~/ m' G# x
- {
; B2 K, p0 E' i; e- D5 f - u16 temp;& x! p: V' M1 h
- u8 ensure;# F n9 }6 w) m: h, t6 L, S8 u# v l) r
- u8 *data;
; b4 W% e' f! e3 N. F3 G0 k - SendHead();
4 v* k2 y3 {/ ~4 }2 } O4 y+ @ - SendAddr();+ Q; Q: ?' n7 s' S
- SendFlag(0x01);//命令包标识: E7 i! T8 Q1 p& _) b/ F5 B
- SendLength(0x07);: H. l7 U; a, _ v" V, m4 X
- Sendcmd(0x0C);: ]+ l, u( E. `: F2 ^& B7 i5 P
- MYUSART_SendData(PageID>>8);
! Z6 g, z) k; q: S9 r2 H9 C - MYUSART_SendData(PageID);
( y7 e5 s. M% Q2 h9 v- E0 T - MYUSART_SendData(N>>8);& E5 _0 X; M% R" Q+ B+ H+ [
- MYUSART_SendData(N);3 [) L1 Q( N& h
- temp = 0x01+0x07+0x0C# e: B U x/ H; b+ E' F5 I
- +(PageID>>8)+(u8)PageID' z" Y4 b7 T! D; E
- +(N>>8)+(u8)N;
/ V' @& i# T# t' U - SendCheck(temp);5 s& F7 X) n6 g- N
- data=JudgeStr(2000);5 H/ c$ \/ s1 e# B
- if(data)
; W- c$ O! U* m) T( B0 n8 F! D* u - ensure=data[9];) Y, o. Y4 z3 Z
- else; ?0 Z) A3 {2 o) @9 P% |+ C% G
- ensure=0xff;
( R# v6 T; h0 B - return ensure;
6 @4 K% w# q: g; V5 v - }4 h+ a3 p6 Z( [) E1 p- T, i. Y
- //清空指纹库 PS_Empty! L* E& x' ]) f' n0 Z+ D
- //功能: 删除flash数据库中所有指纹模板
( Q6 M1 A5 I, N$ k3 Q - //参数: 无% v3 H! _; A. F
- //说明: 模块返回确认字% ^5 s% a9 v& a/ F* A# m W& y; L7 I4 v4 W
- u8 PS_Empty(void)7 j4 G: t/ V O1 e1 g
- {
) i* j3 i0 j, `6 f* g3 W - u16 temp;
8 V8 l$ e7 g V* Q+ N+ F - u8 ensure;0 P, v4 l. L) G* B5 z
- u8 *data;
`& x1 E1 l- }, ?' ]+ E - SendHead();8 }) [' m* Y) T! a3 X
- SendAddr();: r5 ^/ ~/ D( a& K/ _
- SendFlag(0x01);//命令包标识
6 k9 {9 d( d3 ~+ \& S$ f- @ - SendLength(0x03);3 @ U7 z: n- I& O1 V
- Sendcmd(0x0D);
) o: Z% Z m; R; Q5 q - temp = 0x01+0x03+0x0D;% ?& ?& |% \2 _" L7 o o. J" ^
- SendCheck(temp);- V7 M- E4 k. l6 C# P+ _. W, a8 \
- data=JudgeStr(2000);$ a8 M; z9 q3 X
- if(data)/ u: y. p9 ^1 |* f& e- v
- ensure=data[9];# S# T; D# G% i0 g1 }2 c. ?. B
- else
6 D% `+ H" u8 n6 R- y) q" G - ensure=0xff;4 P3 }5 q. [5 t4 V: b
- return ensure;1 O3 X6 e/ C" s4 `% V- G6 q
- }
3 z3 ~9 N, ^6 i2 D: ~ - //写系统寄存器 PS_WriteReg
0 A% T8 i, l. l* B3 x7 ^ - //功能: 写模块寄存器1 ?' l- h( \& s' {
- //参数: 寄存器序号RegNum:4\5\6) y# t& S! I! U( P# `
- //说明: 模块返回确认字; D W5 f0 w0 w& h
- u8 PS_WriteReg(u8 RegNum,u8 DATA)
% r$ K6 ?/ M4 t, P# S9 O5 [: ` - {0 G: C$ J* {' t: ~& d/ [. {
- u16 temp;
5 O, ~0 z; Q4 G# R: S$ L - u8 ensure;
% J5 K N( F/ o) ^ - u8 *data;
- s- N/ p3 }" t& W% P - SendHead();
/ n- l, g. |, M - SendAddr();
' Y* `. w: T( v) D8 ^5 S - SendFlag(0x01);//命令包标识5 i$ z1 Q( m$ _: j0 f
- SendLength(0x05);
4 t% _2 O$ K) z8 K1 F$ O! { - Sendcmd(0x0E);: U. I) z( c0 n* w. w
- MYUSART_SendData(RegNum);- [/ L! p0 D M2 O) N# f
- MYUSART_SendData(DATA);0 w; t- L5 V( e2 W0 @8 _# R" M
- temp = RegNum+DATA+0x01+0x05+0x0E;6 V, Q9 w/ y! s
- SendCheck(temp);
% W* \1 K; ]/ y6 x) \: } - data=JudgeStr(2000);6 ]# ?+ }0 }+ K/ a4 p* B% g! o
- if(data)5 t1 O6 p0 ~ }/ A& Z1 A* J
- ensure=data[9];
$ V o# v" O( C0 ^ - else8 U; g7 ^4 ]6 U
- ensure=0xff;# B, [: ^# E: e# @$ C. O
- if(ensure==0)
: \% }2 @3 h/ K% i V - printf("\r\n设置参数成功!");
s: M0 i( F) n2 C: k5 c# G) [ - else% x- Z; t# ]( w6 N
- printf("\r\n%s",EnsureMessage(ensure));
+ H- }+ O2 o& f5 r& W1 z( q& { - return ensure;" Y; b, _2 M3 r1 Z
- }$ m' G: ]/ M$ O! h Z* r' L
- //读系统基本参数 PS_ReadSysPara
/ r- Y: E, x1 d$ ?4 B6 i+ q - //功能: 读取模块的基本参数(波特率,包大小等)
- a, q" H% K1 `3 D# `. \" ]- A - //参数: 无
; b' r" R! R4 l. ` - //说明: 模块返回确认字 + 基本参数(16bytes)
V$ _1 b% P" C, t; W" a - u8 PS_ReadSysPara(SysPara *p)+ @" A( N( d9 b0 F& E6 u: l
- {2 @0 X( P1 T# ]; {) _5 S3 H; {
- u16 temp;
/ y% T' |$ U! B - u8 ensure;
0 I# o! M# `. F; X ~ - u8 *data;
0 f8 C. t/ W& v7 |* S- a, h3 K A( V - SendHead();
4 |' Y5 K2 _7 }4 _ - SendAddr();
2 s& D- C/ y' S. K7 h - SendFlag(0x01);//命令包标识
) M1 N, m( G, `- ] - SendLength(0x03);
! t9 N, e. g9 W) _; s1 \ - Sendcmd(0x0F);
, b$ E! g7 C: i5 B! W" | - temp = 0x01+0x03+0x0F;* K2 o* T B# T/ o* ?- Y5 s
- SendCheck(temp);9 q5 k- U/ S3 W) X' [0 ~
- data=JudgeStr(1000);
/ h# B0 H' O3 T' s( P, Z - if(data)# J5 B, O2 r. h* A
- {
( p6 T, P& o! ^2 n - ensure = data[9];$ C2 C2 M. y1 W( l# V- I* T2 j5 x
- p->PS_max = (data[14]<<8)+data[15];
9 ], u* o3 z$ g, ? - p->PS_level = data[17];5 U D" u- h3 Q: U' h
- p->PS_addr=(data[18]<<24)+(data[19]<<16)+(data[20]<<8)+data[21];
' F- O% W" e5 J$ B t - p->PS_size = data[23];+ e" q; z9 y! n. ^/ z
- p->PS_N = data[25];
. x/ i" f: I- x6 ?0 h - } ; _- o9 Q, o3 @6 |9 d' f
- else# F+ L5 o, Q1 v! G
- ensure=0xff;
$ J2 T, l8 t$ a5 n2 K1 C/ F! g - if(ensure==0x00)
& U( n* S1 F8 h - {
- L9 t3 L& f' h& M! F - printf("\r\n模块最大指纹容量=%d",p->PS_max);7 t$ s5 Q! E4 v) @; T; R, o
- printf("\r\n对比等级=%d",p->PS_level);1 f" \# f! G9 |
- printf("\r\n地址=%x",p->PS_addr);
P# p( }5 f$ B* R7 R1 P3 \ - printf("\r\n波特率=%d",p->PS_N*9600);
/ } u3 }3 Y: d" B - }
( Y# R8 `3 m3 \2 I4 D8 J8 ` - else 3 G% `9 y6 s8 O6 ^9 M. v7 _" K
- printf("\r\n%s",EnsureMessage(ensure)); y( C5 `+ s x! b2 @, n
- return ensure;) ^ l% @0 k; u4 Q+ A1 O
- }
6 N9 v0 E$ `/ U1 g m7 ~ - //设置模块地址 PS_SetAddr8 a# I3 r9 F' g4 D0 U
- //功能: 设置模块地址
/ N: b; n' M3 \+ O3 E - //参数: PS_addr
, E) H% t& O4 c" K: F8 Q - //说明: 模块返回确认字
8 L: D/ K0 S4 ?. O - u8 PS_SetAddr(u32 PS_addr)7 }) T( C2 P+ @/ Z0 I
- {0 \3 d# w/ _/ F3 k" s3 D% D% S
- u16 temp;
5 Z# y& b4 l# X7 Y2 x& C1 J+ F7 ~ - u8 ensure;7 |6 e* W; r2 v6 [- ~8 \8 }
- u8 *data;3 L* m+ v/ v8 J6 ]- p5 r8 m6 K
- SendHead();
7 s9 k: m" Z& P! F7 c - SendAddr();
! a1 x; ]' K j& F! F& ` - SendFlag(0x01);//命令包标识$ u- R9 }7 q( Q- Y& {) f
- SendLength(0x07);" K. g4 _- R0 A8 O
- Sendcmd(0x15);
: a+ ~9 W; a6 h2 ~" I/ K4 I; L* Q - MYUSART_SendData(PS_addr>>24);
$ ]& c% J' o0 |# x8 N" H- s - MYUSART_SendData(PS_addr>>16);/ O7 A* O2 i7 v( s% v
- MYUSART_SendData(PS_addr>>8);
# W* g8 e. x- H |8 a! v - MYUSART_SendData(PS_addr);
0 r; e3 d: ^5 m - temp = 0x01+0x07+0x15
* B G7 }) H" A: P - +(u8)(PS_addr>>24)+(u8)(PS_addr>>16)2 ^' l5 B5 ^- Z. D3 S' j
- +(u8)(PS_addr>>8) +(u8)PS_addr; 9 \1 z. y; Q) @7 a7 m3 U' q0 W
- SendCheck(temp);8 g r: ?1 T+ E3 S4 N' O' P; i
- AS608Addr=PS_addr;//发送完指令,更换地址
" _+ A* R y1 [8 w7 G/ s - data=JudgeStr(2000);
# _1 }: X- A$ V" x0 Y - if(data)3 U" Z s2 t0 P0 M! |* M8 x. x6 k
- ensure=data[9];
/ ~* g5 B& S& S/ r2 N& O! s - else
8 V6 J O: y9 S) H: h B8 o. `) C9 N - ensure=0xff;
6 g& \) P/ A4 o8 Q7 {- Z - AS608Addr = PS_addr;9 _1 V! C5 r. Z! b, R( r
- if(ensure==0x00)
/ a1 p9 k( u, B4 U, }. P3 A - printf("\r\n设置地址成功!");
8 I$ z/ j+ M8 s - else1 w- z" E" N |( ?
- printf("\r\n%s",EnsureMessage(ensure));6 \$ U7 e" {1 c" \: R4 f7 _9 C
- return ensure;! K0 K, f) |6 `1 o/ J: K
- }& ~$ D. }3 W b: A" B+ @; f* {! Z
- //功能:模块内部为用户开辟了256bytes的FLASH空间用于存用户记事本,
; S, z- I: l' A - // 该记事本逻辑上被分成 16 个页。+ g" ?: n& m3 S m) T
- //参数: NotePageNum(0~15),Byte32(要写入内容,32个字节)" L6 t0 L+ `2 ^ e; B! M1 R
- //说明: 模块返回确认字' S0 t+ j# J4 T, Y; h
- u8 PS_WriteNotepad(u8 NotePageNum,u8 *Byte32)2 F' i0 w# I6 z- p* N
- {( y8 P. q7 [2 S9 W' p# H
- u16 temp;. ?+ y" K: J# s* l- }+ W' T
- u8 ensure,i;
; i0 c( K, C. _ - u8 *data;3 @* g/ M% r/ I
- SendHead();" E: O+ h. m% X5 E- q) Q; o
- SendAddr();* R( s. a: F. K( [) b' `
- SendFlag(0x01);//命令包标识
* I7 L7 k, ?/ d2 G$ h5 U: M: [0 y - SendLength(36);
+ {% W+ ]! {+ V( m' Z+ d - Sendcmd(0x18);
+ W) B* M, e( [+ r/ L - MYUSART_SendData(NotePageNum);* K0 S/ g6 { x* t8 G. Y6 {
- for(i=0;i<32;i++)
/ b Z* t3 ]& } - {. C8 j2 U( k* @1 \2 S
- MYUSART_SendData(Byte32[i]);
3 d- F' O6 X/ A' }( u' N9 X - temp += Byte32[i];' H, W1 a. i) y: r X! o. a
- }7 l3 V. Z7 s. ^; t
- temp =0x01+36+0x18+NotePageNum+temp;
; o" W. e. K6 q! K! W& N - SendCheck(temp);
" ~/ `; |& k9 S, b - data=JudgeStr(2000);: t( z! j5 Q9 e" K
- if(data)* _7 ^: N5 v1 H; A" [# a- ?5 L3 D, I
- ensure=data[9];/ ]+ R {9 ?& Z- U9 u
- else. ~1 A7 J' V) l+ m( Z
- ensure=0xff;
4 @% U9 S q# a# D3 [ - return ensure;6 F* c. Q7 J. U# j) J9 f( [; N
- }
2 y; F# g: E4 c- ] - //读记事PS_ReadNotepad
1 H" q* e' D7 `, T) ]; M* }) t - //功能:读取FLASH用户区的128bytes数据# G* A. o* k. q" S, Y1 L! }
- //参数: NotePageNum(0~15)4 V. Q& Y N6 }1 r+ u' m# g% m
- //说明: 模块返回确认字+用户信息! C! [. Z& r, _; c3 ?$ N
- u8 PS_ReadNotepad(u8 NotePageNum,u8 *Byte32)
# f7 ?& M2 j' t3 z: e - {
7 G0 R& s! n% R$ e @1 E2 f W, J - u16 temp;0 L. a# C/ _4 U! v
- u8 ensure,i;. w) {* M. a9 c
- u8 *data;
9 h& Y; G- B. G7 Y0 n - SendHead();) p0 c1 b. E0 ?0 V# t8 z
- SendAddr();
% ~9 Q# L2 _) o( p - SendFlag(0x01);//命令包标识
8 k4 Y& `, c H - SendLength(0x04);
, P2 J+ S7 D! B% o8 s4 e - Sendcmd(0x19);
8 }& Z* }. X) \" R - MYUSART_SendData(NotePageNum);
+ L, Z; @3 C3 ^8 u Y4 N - temp = 0x01+0x04+0x19+NotePageNum;9 m# H6 f6 s; _- r5 z
- SendCheck(temp);
& _/ r* I; h9 l8 D4 Y5 y8 l - data=JudgeStr(2000);
% Z. A+ b) F( y: r8 i' U; u Q - if(data)
+ T# F5 l4 { u, o) ^$ O2 o. `& n - {: u) @! j' A, Y7 E' C
- ensure=data[9];9 J# c" v- [; w2 [6 m& x
- for(i=0;i<32;i++)" H$ i6 r) B* {' y
- {5 F2 L/ J- E% T2 q I* p
- Byte32[i]=data[10+i];
" X2 X3 v9 r& _; m - }6 b4 @% t5 S' R9 n' T
- }: N7 [) {! e+ j
- else& X$ N( F/ U) v2 L
- ensure=0xff;
5 K v& [6 u/ M& |) s - return ensure;3 U" M/ K) W! B1 D, h9 P
- }3 ]; ~6 Q8 x2 l7 s* Z9 A
- //高速搜索PS_HighSpeedSearch, C! m8 r* k1 z$ d
- //功能:以 CharBuffer1或CharBuffer2中的特征文件高速搜索整个或部分指纹库。
. }$ c* [9 ^( S$ c L3 Q8 u, a - // 若搜索到,则返回页码,该指令对于的确存在于指纹库中 ,且登录时质量
: T' d! \. g7 `2 | - // 很好的指纹,会很快给出搜索结果。0 b& T6 G3 d: M+ G9 F
- //参数: BufferID, StartPage(起始页),PageNum(页数)0 P5 R! \6 o) [, y4 W) q
- //说明: 模块返回确认字+页码(相配指纹模板)
9 H2 K! K7 s( h8 p2 U& \# u- m - u8 PS_HighSpeedSearch(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p)" ^5 n0 H$ L2 v# q( j. o) {* x
- {
9 B e/ I a" g( I - u16 temp;
5 G) P6 m) ? _ - u8 ensure;( C3 j2 k$ z- d/ g- Z |1 Q
- u8 *data;
# V+ b0 h& \9 [) q9 P) w& q1 w2 q9 J: i4 ` - SendHead();. \4 {" i9 b1 {0 M2 O8 T0 e; a
- SendAddr();$ V8 R9 X; U5 j( W0 ~$ o
- SendFlag(0x01);//命令包标识 [0 y: P/ n! k, R/ |# g6 Q
- SendLength(0x08);$ s3 B9 ]* p. W
- Sendcmd(0x1b);
' G. F0 y# ~/ A. h - MYUSART_SendData(BufferID);
4 k9 j2 }0 }$ N% x - MYUSART_SendData(StartPage>>8);: V" N4 b$ w4 k9 J+ m0 Q
- MYUSART_SendData(StartPage);+ }% O Q P$ q$ V J
- MYUSART_SendData(PageNum>>8);7 O0 |7 b+ [) \$ j8 M! E2 M
- MYUSART_SendData(PageNum);. a7 E. a& g% m8 f6 b3 h
- temp = 0x01+0x08+0x1b+BufferID$ k F+ p5 n, w2 x8 W
- +(StartPage>>8)+(u8)StartPage
$ X1 f' s( [3 q' \5 C( h - +(PageNum>>8)+(u8)PageNum; C5 N5 U$ {9 i @
- SendCheck(temp);5 U( `: B1 D' R3 x5 _' i- H; \4 y
- data=JudgeStr(2000);
& j6 D: a& ^, j+ U* @ - if(data)2 B5 Q% e. X+ J8 n- ^0 N
- {" G# A5 g. O' p' \5 p( e
- ensure=data[9];# [2 a0 W+ P( I8 K' A5 d" F [
- p->pageID =(data[10]<<8) +data[11];
$ T5 Y4 N/ z5 _( f/ I - p->mathscore=(data[12]<<8) +data[13];
/ ?3 m/ s" O+ Z' r1 u) q. h - }
+ f9 D$ c5 k2 k3 l - else
, o* _0 m1 \$ M - ensure=0xff;
) k H$ }$ J Q2 o4 x6 G# ? - return ensure;
. g2 c5 @9 ^# p - }
3 Y7 x" |2 B: r* _7 o1 K - //读有效模板个数 PS_ValidTempleteNum
. g2 d4 h, a! R- P - //功能:读有效模板个数
$ x3 e; s: O, w+ R b$ g - //参数: 无
6 e, y3 ], M( T. { - //说明: 模块返回确认字+有效模板个数ValidN
6 t' b; f# K3 O( N5 y- n# P - u8 PS_ValidTempleteNum(u16 *ValidN)4 w! c X( `$ Y0 l* E8 x0 ?
- {0 P* ?) {6 Y2 w' C: a, w
- u16 temp;
5 a: f' g1 y. d, v3 l$ h - u8 ensure;
# k% B! X2 I' @# U& z8 B - u8 *data;) N! c! u Z7 M
- SendHead();# U7 r' ~. V% z; p, k% A
- SendAddr();
0 l4 {4 ~$ _' M1 D - SendFlag(0x01);//命令包标识2 I2 D/ }) x1 a4 [: h9 m( M
- SendLength(0x03);
' ?6 D s- X: M - Sendcmd(0x1d);
4 f; u- j$ X! N$ }* U - temp = 0x01+0x03+0x1d;+ o' P3 d* n) _4 R& j
- SendCheck(temp);- a2 ]( s/ x: m
- data=JudgeStr(2000);
, m$ e n, L1 K" |0 _7 E - if(data)
. N# f) r0 d4 I0 ^; Q/ { - {
0 V: s3 n# M8 w - ensure=data[9];
+ J$ b3 s$ L( i, ~ - *ValidN = (data[10]<<8) +data[11];% {, t2 \- E4 {6 b
- }
3 C- e; c% D+ Q+ q; z( z, @ - else
8 a+ `7 c* b6 t0 |7 i - ensure=0xff;
4 U, R( j* }5 n - 8 g) H# F G; A2 U- E) z7 n* S
- if(ensure==0x00), t: S- @5 i% H$ L9 x. \
- {' ?0 W2 p# }% ~
- printf("\r\n有效指纹个数=%d",(data[10]<<8)+data[11]);& _+ l G- ]- ]8 p9 ?3 |2 {. _
- }* ~- d; E Z1 K9 u) b7 p5 c: i9 i
- else/ ?" H- Q% m! [" V! ^
- printf("\r\n%s",EnsureMessage(ensure));
~- X* Y- h3 m' t( |$ t - return ensure;
1 | y7 A2 x( C) S( ?% u - }/ c. @/ a' ]7 ?0 z: [1 I b3 t6 I) x% ~
- //与AS608握手 PS_HandShake
; [& t" ?4 u: t! ^" M - //参数: PS_Addr地址指针- m8 u4 Z) u. D
- //说明: 模块返新地址(正确地址) 3 Y& w1 [$ b, N; H( ]
- u8 PS_HandShake(u32 *PS_Addr)
( |& P) ~2 x( _* u% _) ~9 Z - { 8 k( {. C( t2 r& [% ~
- SendHead();: y, I" i% y& m- T, J1 T
- SendAddr();
9 F" t) x* W4 ~; k - MYUSART_SendData(0X01);4 v5 k5 x/ Q n
- MYUSART_SendData(0X00);* y9 {2 | P! n( H a' s
- MYUSART_SendData(0X00);! ]% e+ v, X" |1 S$ }0 _4 ^7 R
- delay_ms(200);- M! s- P$ F! g/ P
- if(USART2_RX_STA&0X8000)//接收到数据# J/ f* [6 t! V6 N
- { ' X9 G" `7 ^' j2 w. y
- if(//判断是不是模块返回的应答包
' G4 K- o2 i+ E2 C3 \3 q - USART2_RX_BUF[0]==0XEF1 b( f9 \2 n' _( b$ J. n
- &&USART2_RX_BUF[1]==0X01
! W7 }/ ~% I* I3 ]+ F5 K - &&USART2_RX_BUF[6]==0X07( |5 N, }: t% W; @1 T3 R
- )
: |1 {6 x1 @! O- a+ \' \ - {
2 u$ p2 H- {7 C/ z" J1 r9 F* [0 { - *PS_Addr=(USART2_RX_BUF[2]<<24) + (USART2_RX_BUF[3]<<16)0 x( Z9 h; M3 ]
- +(USART2_RX_BUF[4]<<8) + (USART2_RX_BUF[5]);6 R; E. I0 d" m. E
- USART2_RX_STA=0;
- y' X% k/ S8 {4 K - return 0;5 d) T2 f& j5 g, O4 f. Q2 t
- }, R; h" M0 A2 B ^
- USART2_RX_STA=0; 8 _0 R, K' ?; E& p
- }/ h! Y3 E9 }# }1 p
- return 1; $ V. Y+ ^1 u, T6 X
- }9 E+ d) R% m( A
- //模块应答包确认码信息解析
. W& l' w5 w" A; z. Y - //功能:解析确认码错误信息返回信息 w* ]+ A$ f5 F( r- C3 V
- //参数: ensure
) S6 J9 ?, o3 z( v - const char *EnsureMessage(u8 ensure) 6 J* ~( |* D" _
- {: }- t8 {+ f2 [! @8 N* C
- const char *p;
6 f% N% h% w p - switch(ensure)
6 j c7 F; F6 D5 ^8 S - {
0 P8 f9 U ]# _# e, e - case 0x00:% M1 |. j5 N7 T1 k6 |8 ^
- p="OK";break; 2 U0 ^: F2 i; l0 ^
- case 0x01:3 X( Q$ ]. F0 r7 U% x' E4 V4 p
- p="数据包接收错误";break;( i4 `0 m) R2 I+ R
- case 0x02:0 M2 e7 h0 s: H1 j! y
- p="传感器上没有手指";break;# N" @) k/ l6 C5 \: j/ n8 h
- case 0x03:
6 U6 `9 ? e* Y7 ?. _( C- X! A9 v - p="录入指纹图像失败";break;
~% o# J* [$ j- } R - case 0x04:8 L% ]7 V* V' Z: b
- p="指纹图像太干、太淡而生不成特征";break;
. R( f T- ~! h8 [( R - case 0x05:- N3 J- m- v/ }( W }
- p="指纹图像太湿、太糊而生不成特征";break;
* z; R! C9 Q* e5 I - case 0x06:/ `# }0 u! |) ~+ w+ q
- p="指纹图像太乱而生不成特征";break;
+ U6 K6 I: E v - case 0x07:4 J* }6 |5 W3 K
- p="指纹图像正常,但特征点太少(或面积太小)而生不成特征";break;
{2 x0 h- C, w1 \ - case 0x08:
" H) B V0 [! m1 }- z; E - p="指纹不匹配";break;& {5 E6 G# R! C# r
- case 0x09:: W7 b3 d; m3 B. e( b
- p="没搜索到指纹";break;5 k) \) N% u# s" N5 `
- case 0x0a:* N7 C: ^3 B) Y# ?# S+ Q+ O
- p="特征合并失败";break;
g1 y7 \1 a% a - case 0x0b:, ?) G; @' c, ~9 q
- p="访问指纹库时地址序号超出指纹库范围";
4 l4 T3 _2 ?) ^6 h5 ]; y$ T9 D- x - case 0x10:0 J" g( n. u: K# ]! |( a& v* j
- p="删除模板失败";break;4 \2 L9 ?% \! S+ r+ k! A; P5 a/ B
- case 0x11:
' k) k9 v. I7 ]. E4 W$ @- i2 t - p="清空指纹库失败";break;
$ A4 N N9 a" L4 b& z* r8 N - case 0x15:
+ q& r4 ?/ p/ V% g - p="缓冲区内没有有效原始图而生不成图像";break;
6 D, E8 d0 ]0 x2 _0 O7 F - case 0x18:
" z3 m( N" a! `: P3 _" a/ Q - p="读写 FLASH 出错";break;0 P. c, R1 Y4 H/ @) {3 V
- case 0x19:
4 O. o. ~( V3 J O% x - p="未定义错误";break;( d; h4 E7 x4 U' C
- case 0x1a:
3 g3 y+ l: \ j! ~$ }. \ - p="无效寄存器号";break;$ L7 m* d' Z5 h; r
- case 0x1b:
8 |3 ?3 }1 L/ q - p="寄存器设定内容错误";break;: _* m( K8 H: m: w9 k! |6 D/ w
- case 0x1c:
4 v$ x- I0 U$ d, c - p="记事本页码指定错误";break;9 T# H3 z1 O9 f3 g. U
- case 0x1f:
) L, ?% W( Q! _& Z - p="指纹库满";break;
8 ?, N- v1 i- h/ A - case 0x20:9 y4 Q& @9 O5 ~: \* Y* [* A
- p="地址错误";break;; B* C7 J$ K' L I
- default :
, v) ? E7 Q0 p: w - p="模块返回确认码有误";break;6 A1 b( x' [" b- i
- }" A3 O; @5 u& q* r
- return p; 2 n7 F s* f; z; f
- }
复制代码
% Y9 ]8 t5 t6 ]8 B$ o刷指纹$ p) n6 r4 N+ }3 U5 }( ?
- void press_FR(void)- Z- Z1 u, n+ K1 I/ F3 d
- { M" O2 I" t/ u, p, v( q- d* n5 k
- SearchResult seach;
+ o! P( @" i5 w$ b7 h7 A7 u6 V9 j - u8 ensure;
# H0 D8 ^& x1 p# o( o% A u0 ~ - ensure=PS_GetImage();1 A2 t k" C* U0 Y# U; l
- if(ensure==0x00)//获取图像成功
( G0 h4 j& i& i+ S0 n4 r0 b - {
u7 O7 Z2 s) [ - ensure=PS_GenChar(CharBuffer1);
& x5 g+ c6 a: l z2 R% N - if(ensure==0x00) //生成特征成功
7 \; V" x6 v5 j7 |3 Q; \ - { % s$ _1 n1 d8 F, d5 d
- ensure=PS_HighSpeedSearch(CharBuffer1,0,300,&seach);
' i r o' p+ P3 F - if(ensure==0x00)//搜索成功! }6 I9 T: s5 H$ d& A8 y4 c. O
- { 8 L; {, p2 P/ V, ^% @+ S/ o5 A3 _
- printf("search the fingerprint successfully\n");//搜索指纹成功
P7 x$ |2 G; o' q" N R -
. o9 @& o, k- _# f2 G t4 O - printf("Match ID:%d Match score:%d\n",seach.pageID,seach.mathscore);//显示匹配指纹的ID和分数$ F+ J9 y( t J" t: I9 e
- % r5 c f; L6 e; l+ C
-
/ D! c0 f, J1 m - if(seach.pageID==0), e0 v! S3 ]! F5 K
- LED=0;+ B. |8 R& U+ e9 ~
- }, a3 R& [' y: N
- else 2 J& D' A2 Z& q
- {# ~, R- v9 x9 S( Z
- printf("%c",ensure);
( \$ n. D* Z ^0 N7 [: \1 A - LED=1;, x4 u1 ]+ |- `3 d. }. U1 j
- }
6 ~4 R; W6 J# _" o% N8 A/ e - }
+ l8 \; T P7 q7 I! S4 F; N9 N - else
3 i3 ~+ [9 T& x - printf("%c",ensure);, \' n' o Z: Y0 \" u9 h. A0 F2 B q
- delay_ms(1000);//延时后清除显示
5 ~5 S% |: w# V9 w/ x& ?3 A0 q1 t - printf("\n");
1 q* M- @# n. R" c - }
& j2 \! s0 _+ j |, L$ S) G* k! q; c -
* v$ U& v5 @/ `, L+ _ - }
复制代码
6 ^( h8 k5 e+ w" P$ T录入指纹# \$ G! i) G# Z! H0 o5 P( X
- void Add_FR(void)
! _: d8 L1 ~# ~) K - {
- z7 Q; e- |$ z( W% U - u8 i=0,ensure ,processnum=0;
' p( M5 Q0 `, P! w$ _! P - u16 ID; X5 o& ~% I% |7 N* |9 V9 d
- while(1)% a' u$ g( _" h- W# L% F9 Z
- {
6 Y) \0 X3 d$ Y8 U0 a - switch (processnum)$ y) R- ^" A" M- v
- {
) X9 `! k+ a* i) \, l. M2 Z; ~ - case 0:
( {: ~" D5 g( b - i++;' ?# I3 w+ m& q; r: [6 F4 D9 X
- printf("please finger\n"); //请按手指$ u3 w& z4 y4 c7 k N f4 W
- ensure=PS_GetImage();//录入图像返回字; f- _0 J; a t. ?9 l/ Q: s9 w' b
- if(ensure==0x00)
6 I! ?% P1 z& g8 u4 l9 N# q - {: h* V7 t T: _
- ensure=PS_GenChar(CharBuffer1);//生成特征
& s8 @. { K6 E' {; A5 T - if(ensure==0x00), C4 `& O2 V9 q: J: J* r. M# x6 a
- {$ U6 a$ P1 {* }" r! {% T# F. V1 o6 u% ]! n
- printf("zhengque\n");//指纹正确
9 P; U6 q$ [+ H! D - i=0;+ k) k- p7 H9 u" i, h( u4 h: i9 Q
- processnum=1;//跳到第二步 9 h! o0 g- N2 i+ P, H4 U% ^
- }& \( B/ t" R; X% y- G. P
- else printf("%c\n",ensure);
' D3 Y$ E9 b* ?" {' h" L' D - }
7 j; p# [5 p2 |- \9 ~$ H" H - else printf("%c\n",ensure);
: ~1 N" N, W. r8 V) W# v9 f# E. y - break;
. D/ A$ K' d8 S! T6 I! M - 2 |6 u/ ?' o" N0 h! T! _0 F
- case 1: y" U7 h7 x5 d3 W0 X
- i++;
- S; X2 L" p' z- `' D' g - printf("please click on the finger\n");//再按一次手指! p# E1 S: R# g$ w2 {, h
- ensure=PS_GetImage();
3 w% {% y- ]) Z2 Z. H; |1 N - if(ensure==0x00)
& a; w9 ~9 D, H9 ` - {
$ J/ q6 G3 O+ R) S0 w _ - ensure=PS_GenChar(CharBuffer2);//生成特征
0 D" b5 ^( N' ^5 }: I$ A - if(ensure==0x00)* q# H7 n# q8 h5 v% u! A9 i3 h/ [
- {
4 e" l% U5 ]# L, v! `1 N* d - printf("Fingerprint right\n");//指纹正确1 X* s% w) m" r, E
- i=0;
* C' G3 s5 | h6 _3 D - processnum=2;//跳到第三步2 _5 q0 ^& @3 G6 p% Y, m! H
- }else
`6 M$ n, ?, k$ i+ ~+ u( y - printf("%c",ensure);
8 u; ~9 P5 C4 }% w8 E4 P2 K - }else
% F5 k8 M7 X" o: [" k - printf("%c",ensure); $ r _5 y& O% { E7 U
- break;( ]5 e, y7 O# B+ f( m
- case 2:
4 K+ v/ E* j) i% D; O, b - printf("comparing two fingerprints\n"); //对比两次指纹0 g. \1 |: U. u. Q0 [+ e
- ensure=PS_Match();//精确比对两枚指纹特征返回字
4 k& |" M, z7 m4 o( k - if(ensure==0x00)
! H# Y1 g0 ? H/ _( `% L5 Q - {3 M% S- P! G% h8 q1 E5 N
- printf("Two fingerprints is the same\n");//两次指纹是一样的9 ]; n& p7 A1 I8 {" a/ ^. O6 M" L
- processnum=3;//跳到第四步# e3 ^( `, D) R5 c3 e' K
- }
( Q8 @* m" i( x+ L+ {9 I/ j u - else
; w& d! f9 |% x. [4 E$ R - {4 R( o" b3 H" K' \
- printf("Comeparative failure,please press fingers again\n");//对比失败,请重新按手指* z+ R+ q2 e k2 V# @' N0 N
- printf("%c",ensure);- l$ s7 j: G2 n$ w* ~- a; O3 E
- i=0;& m2 {( ~, l" o7 t$ l
- processnum=0;//跳回第一步
' ^% h5 N7 w' n B/ ~" V4 d - }
' K& ]0 \ h f+ B" J - delay_ms(1000);4 n0 N: b# ~$ y+ K, Q
- break;
' i$ }% O F/ }' f - case 3:
6 C0 N; X: N! G9 X - printf("generate a fingerprint template\n");//产生一个指纹模板
# s' j4 T3 ?$ C* l. j! P1 C4 ] - ensure=PS_RegModel();/ Q% }$ J% K" J! I6 G1 X
- if(ensure==0x00) $ U* B, n1 T3 D- f
- {+ u; l( I) ~% c4 J( N( T
- printf("generate a fingerprint template is successful\n");//生成指纹模板成功
( W4 `5 A6 N+ L - processnum=4;//跳到第五步/ ?# d/ H( }' n! }! z$ F
- }else {processnum=0;printf("%c",ensure);}
7 A2 y7 K& {( ?2 v2 l. \ - delay_ms(1000);
% i8 r8 G, y- ?: c' A+ k - break;% Q" h/ f6 q( @: V
-
4 g# f6 r: r% B. c( V: F - case 4: % M5 Y: J0 Z* R" \2 t
- printf("input the ID and press Enter to save\n");//输入ID并按“Enter”保存
: w$ a5 u3 }; {5 I1 g) r - printf("0=< ID <=299\n"); ( n, I z" D1 A& P4 }0 l% r3 U3 t$ F
- do3 X y j" ^' G0 \+ F7 t- N" b+ ?
- 7 T( G8 D9 E) z, X6 d- ]5 l
- {7 p8 ~" o) r0 O0 V& Y
- ID++;
$ p! g F. R' p( h. r8 b - }8 O/ a! H5 G, u+ O$ _- ~3 l. b$ e
- while(!(ID<300));//输入DI必须小于300
~# [$ ?. i+ G! T - ensure=PS_StoreChar(CharBuffer2,ID);//储存模板 v4 U# O+ k( E9 F& H( Q- M# R5 }
- if(ensure==0x00)
" G" \; Y, R7 z: E9 h, A. `0 K* P - {
. D6 w8 E8 C. u1 J$ A7 m - printf("Add the fingerprint successfully\n");//添加指纹成功( U3 k t) b& d
- PS_ValidTempleteNum(&ValidN);//读库指纹个数& O/ U2 f. C, b. N% t/ ]. |: t
- 1 Y6 O L6 \& o
- printf("%d\n",AS608Para.PS_max-ValidN);//显示剩余指纹个数2 g- W$ C5 W' q1 Z! N# ^; }5 ^
- delay_ms(1500);//延时后清除显示
" [/ p( F- B' _. E' c6 q - printf ("\n");1 {3 t5 Q* u9 v/ f4 G: M' c3 d
- return ;
; v" x! L( b& o0 [; \ - }else {processnum=0; printf("%c\n",ensure);}
+ m" \$ ^( l' z- {& p0 P: Z6 o h - break;
7 E/ c) T& m7 U" o/ d - }
6 r: L G! q& |3 a l$ j5 U - delay_ms(800);
0 a9 Q2 B0 Z z- x) w - if(i==5)//超过5次没有按手指则退出+ Y& G/ P/ t+ N8 V% G: r4 ?( M
- {' ?0 Y9 e. R0 \7 r. v3 g
- printf("\n");6 R* l2 }0 P! j1 R. |1 B
- break; $ ^. Q) m9 a9 W( G
- }
, \2 N1 p! }; i& D' w& O - }
' ?9 L- x0 l, l2 H6 \$ p - }
复制代码
! J: [# b/ y0 Z6 |( `8 D7 q2 J转载自: 跋扈洋 3 ?- k- F5 j! ^3 r. w7 q" P$ _4 Z
|