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