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