附件里都有,感興趣可以自己看
1.1 概述
JM-101 指紋模塊為集成了光路和指紋處理部分的一體化指紋處理模塊,具有體積小、功耗低、接口簡單的特點,可靠性高、識別速度快、干濕手指適應性好,指紋搜索速度快。指紋圖像讀取時,對干濕手指都有靈敏的反應和判斷,獲得最佳的成像質量,適用人群廣泛。也可定制自學習適應功能,根據使用者的習慣、氣候等的變化自動調整參數,做到更好的匹配。具備自學習功能,指紋識別過程中,提取新的指紋特征值識別成功后將該特征值融合到之前的指紋特征中,實際使用過程中越用越好用。
JM-101 模塊還具備感應手指功能,當手指按壓到指紋采集面時,模塊 Touch 腳輸出高電平。
JM-101 模塊通訊接口為 USB 和 UART 兩種通信接口, 本模塊作為從設備,由主設備發送相關命令對其進行控制
Uart主機例程單片機源程序如下:
- #include "Prtype.h"
- #include "Uartport.h"
- #include "Protocol.h"
- /***************************************************************************************************
- ** Subroutine : FunHandshakeModule
- ** Function : 注冊指紋例程
- ** Author : yf
- ** Input : UINT8 nTime -- 注冊時需要按幾次手指
- ** UINT16 wID -- 指紋ID號
- ** Output : 成功:CMD_OK 失敗:CMD_ERR,超時:CMD_TIMEOUT
- ** Description :
- ** Date : 2016/10/26
- ** ModifyRecord:
- ***************************************************************************************************/
- /*
- 1.主機->從機:發送采圖命令采指紋命令
- 2.從機->主機:返回采集指紋結果。
- 3.如果沒有采集到指紋循環1.2步驟直到采集到指紋 或超時
- 4.提取特征
- 5.重復1到4,如果要求注冊3次需要重復5操作
- 6.合成模板
- 8.保存指紋
- */
- UINT8 ExampleErollFp(UINT8 nTime,UINT16 wID)
- {
- UINT8 cRet, ERR, nErrTime, n;
- UINT8 Buf[128];
- UINT16 lenPkg;
- //0.先握手一下,看模塊是否工作正常
- cRet = FunHandshakeModule(1);
- if (cRet != CMD_OK)
- {
- //模塊不正常,再次嘗試一下
- cRet = FunHandshakeModule(1);
- if (cRet != CMD_OK)
- {
- //模塊不正常
- return RT_OVERTIME;
- }
- }
-
- n = 0;
- while(n < nTime)
- {
- //1.采指紋 指令代碼 29H
- nErrTime = 0;
- do
- {
- SY_memset(Buf, 0, 128);
- lenPkg = 0;
- cRet=CommSingleInstruction(MASK_INS, PS_GetEnrollImage, NULL,&lenPkg, Buf,&ERR,500);
- if (cRet==CMD_OK&&ERR==0)//采集到指紋
- {
- break;
- }
- else if (cRet==CMD_TIMEOUT)
- {
- return CMD_TIMEOUT;
- }
- else //CMD_SUM_ERR
- {
-
- }
- //超時判斷
- if (0)//超時退出
- {
- return CMD_TIMEOUT;
- }
- }while (1);
- //1.提取特征 指令代碼 02H
- Buf[0]= n+1;
- lenPkg=1;
- cRet=CommSingleInstruction(MASK_INS, PS_GenChar, Buf,&lenPkg, Buf,&ERR,1000);
- if (cRet==CMD_OK)
- {
- if (ERR==0) //取特征成功
- {
- }
- else if (ERR==1) //表示收包有錯
- {
- continue;
- }
- else if (ERR==0x06) //表示指紋圖像太亂而生不成特征
- {
- continue;
- }
- else if (ERR==0x07) //表示指紋圖像正常,但特征點太少而生不成特征
- {
- continue;
- }
- else if (ERR==0x28) //表示當前指紋模板與之前模板之間有關聯
- {
- }
- else if (ERR==0x15) //表示圖像緩沖區內沒有有效原始圖而生不成圖像
- {
- continue;
- }
- }
- else //提取特征失敗
- {
- return CMD_STEP_ERR;
- }
- n++;
- }
- //合并模板 指令代碼 05H
- lenPkg=0;
- cRet=CommSingleInstruction(MASK_INS, PS_RegModel, NULL,&lenPkg, Buf,&ERR,50);
- if (cRet==CMD_OK&&ERR==0) //合并模板成功
- {
- }
- else //合并模板失敗
- {
- return CMD_STEP_ERR;
- }
- //存儲模板 指令代碼 06H
- Buf[0]= 1; //默認為1
- Buf[1]= (wID>>8);
- Buf[2]= (wID&0xff);
- lenPkg=3;
- cRet=CommSingleInstruction(MASK_INS,0x06, Buf,&lenPkg, Buf,&ERR,100);
- if (cRet==CMD_OK&&ERR==0) //注冊成功
- {
- return CMD_OK;
- }
- else //注冊失敗
- {
- return CMD_STEP_ERR;
- }
- }
- /***************************************************************************************************
- ** Subroutine : ExampleSeachFp
- ** Function : 注冊指紋例程
- ** Author : yf
- ** Input : UINT8 nTime -- 注冊時需要按幾次手指
- ** UINT16 wID -- 指紋ID號
- ** Output : 成功:CMD_OK 失敗:CMD_ERR,超時:CMD_TIMEOUT
- ** Description :
- ** Date : 2016/10/26
- ** ModifyRecord:
- ***************************************************************************************************/
- /*
- 1.主機->從機:發送采圖命令采指紋命令
- 2.從機->主機:返回采集指紋結果。
- 3.如果沒有采集到指紋循環1.2步驟直到采集到指紋 或超時
- 4.提取特征
- 5.搜索
- */
- UINT8 ExampleSeachFp(UINT16 *wID)
- {
- UINT8 cRet,ERR,nErrTime,n;
- UINT8 Buf[128];
- UINT16 lenPkg,sSoucre,FpId;
- //1.采指紋 指令代碼 29H
- nErrTime=0;
- do
- {
- SY_memset(Buf,0,128);
- lenPkg=0;
- cRet=CommSingleInstruction(MASK_INS,0x29, NULL,&lenPkg, Buf,&ERR,500);
-
- if (cRet==CMD_OK&&ERR==0)//采集到指紋
- {
- break;
- }
- else if (cRet==CMD_TIMEOUT)
- {
- return CMD_TIMEOUT;
- }
- else //CMD_SUM_ERR
- {
-
- }
- //超時判斷
- if (0)//超時退出
- {
- return CMD_TIMEOUT;
- }
- }while (1);
- //1.提取特征 指令代碼 02H
- Buf[0]= 1;
- lenPkg=1;
- cRet=CommSingleInstruction(MASK_INS,0x02, Buf,&lenPkg, Buf,&ERR,1000);
- if (cRet==CMD_OK&&ERR==0) //取特征成功
- {
- }
- else //提取特征失敗
- {
- return CMD_STEP_ERR;
- }
- //搜索 指令代碼 1BH
- Buf[0]= 1;
- Buf[1]= 0;
- Buf[2]= 0;
- Buf[3]= (1024>>8);
- Buf[4]= (1024&0xff);
- lenPkg=5;
- cRet=CommSingleInstruction(MASK_INS,0x1B, Buf,&lenPkg, Buf,&ERR,2000);
- if (cRet==CMD_OK&&ERR==0) //搜索成功
- {
- if (lenPkg==16)
- {
- sSoucre=(Buf[12]<<8)+Buf[13];
- FpId=(Buf[10]<<8)+Buf[11];
- *wID=FpId;
- return CMD_OK;
- }
- return CMD_LOGIC_ERR ;
- }
- else //合并模板失敗
- {
- return CMD_STEP_ERR;
- }
- }
- /***************************************************************************************************
- ** Subroutine : FptEx_SaveChar
- ** Function : 傳感器獲取指紋并生成特征上傳給上位機
- ** Author : Comon
- ** Input : UINT8 nTime -- 注冊時需要按幾次手指
- ** UINT16 wID -- 指紋ID號
- ** Output : 成功:CMD_OK 失敗:CMD_ERR,超時:CMD_TIMEOUT
- ** Description :
- ** Date : 2016/11/9
- ** ModifyRecord:
- ***************************************************************************************************/
- /*
- 1.主機->從機:發送采圖命令采指紋命令
- 2.從機->主機:返回采集指紋結果。
- 3.如果沒有采集到指紋循環1.2步驟直到采集到指紋 或超時
- 4.提取特征
- 5.搜索
- */
- UINT8 FptEx_SaveChar()
- {
- UINT8 cRet, cRerr;
- UINT8 nOverTime, n;
- UINT8 Buf[128];
- UINT16 nInBufLen = 0;
- UINT16 i;
- // UINT16 sSoucre, FpId;
-
- memset(Buf, 0, sizeof(Buf));
- nOverTime = 500; //設定范圍如何確定
- while(1)
- {
- cRet = CommSingleInstruction(MASK_INS, PS_GetImage, NULL, &nInBufLen, Buf, &cRerr, nOverTime);
- if(cRet == CMD_TIMEOUT)
- return cRet;
- else if((cRet != CMD_OK) || (cRerr != 0))
- continue;
-
- Buf[0] = 1;
- nInBufLen = 1;
- cRet = CommSingleInstruction(MASK_INS, PS_GenChar, Buf, &nInBufLen, Buf, &cRerr, nOverTime);
- if(cRet == CMD_TIMEOUT)
- return cRet;
- else if((cRet != CMD_OK) || (cRerr != 0))
- continue;
- else
- break;
- }
- do{
- Buf[0] = 1;
- nInBufLen = 1;
- cRet = CommSingleInstruction(MASK_INS, PS_UpChar, Buf, &nInBufLen, Buf, &cRerr, nOverTime);
- if(cRet == CMD_TIMEOUT)
- return cRet;
- else if((cRet != CMD_OK) || (cRerr != 0))
- continue;
- else
- break;
- }while(1);
- //1.order如何定義;2.數據分包大小;3.發包數據總長度;4.
- // for(i = 0; i < tLen/padLen; i++)
- // {
- // CommUpDataInstruction(MASK_DAT, MASK_DAT, Buf, &padLen, Buf, &cRerr, nOverTime);
- //
- // }
- // CommUpDataInstruction(MASK_DAT_LAST, MASK_DAT_LAST, Buf, &(tLen % padLen), );
-
-
- //接收后續數據包?
- }
- UINT8 FptEx_AutoEnroll()
- {
- UINT8 cRet, cRerr;
- UINT8 Buf[128];
- UINT16 nBufLen = 0;
- UINT16 n = 0, nLevel = 10;
- UINT16 nOutTimeMS = 500;
- //指令合法性,是否握手?
- cRet = FunHandshakeModule(1);
- if(cRet != CMD_OK)
- return CMD_ERR;
-
- while(n < nLevel)
- {
- n++;
- cRet = CommSingleInstruction(MASK_INS, PS_GetEnrollImage, Buf, &nBufLen, Buf, &cRerr, nOutTimeMS);
- if(cRet == CMD_TIMEOUT)
- return cRet;
- else if((cRet != CMD_OK) || (cRerr != 0))
- continue;
-
- Buf[0] = n;
- nBufLen = 1;
- cRet = CommSingleInstruction(MASK_INS, PS_GenChar, Buf, &nBufLen, Buf, &cRerr, nOutTimeMS);
- if(cRet == CMD_TIMEOUT)
- return cRet;
- else if((cRet != CMD_OK) || (cRerr != 0))
- continue;
-
- Buf[0] = n; //BuffID 取值規則,范圍
- Buf[1] = n & 0xff; //PageID取值規則,范圍
- Buf[2] = (n>>8) & 0xff;
- nBufLen = 3;
- cRet = CommSingleInstruction(MASK_INS, PS_StoreChar, Buf, &nBufLen, Buf, &cRerr, nOutTimeMS);
- if(cRet == CMD_TIMEOUT)
- {
- return cRet;
- }
- else if((cRet != CMD_OK) || (cRerr != 0))
- continue;
- }
-
- cRet = CommSingleInstruction(MASK_INS, PS_RegModel, Buf, &nBufLen, Buf, &cRerr, nOutTimeMS);
- if((cRet != CMD_OK) || (cRet != 0))
- return cRet;
-
- //指紋重復檢測成功???GetEnroll指令?
- cRet = CommSingleInstruction(MASK_INS, PS_GetEnrollImage, Buf, &nBufLen, Buf, &cRerr, nOutTimeMS);
- if((cRet != CMD_OK) || (cRerr != 0))
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
模塊資料及例程.zip
(2.33 MB, 下載次數: 250)
2018-7-24 12:57 上傳
點擊文件名下載附件
|