#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SynoCommand.h"
//
// 下面函数请开发者按照自己的开发平台进行完善
// 本代码主要是演示如何使用模组协议和流程, 因平台架构设计的不同, 可能需要改造
//
#include "SYglobal.h"
// 平台函数返回代码
#define RT_OK 0x00 // 成功
#define RT_FAIL 0x01 // 失败
#define RT_PARAM_ERR 0x03 // 参数错误
#define RT_OVERTIME 0x04 // 超时
//
// 1、串口向设备写入数据
//
// 成功返回0, 失败返回非0
//
extern int COMx_Write(unsigned char buf[], int len);
//
// 2、从设备读取期望长度的数据
//
// timeout:超时时间,以 ms 计时,如 1000 表示 1 秒
//
// 成功返回0,失败返回非0
//
// 建议采用中断方式将COM中的数据接收到一个固定的环形BUF中, 然后用此函数从BUF中读取,
// 而不是直接从硬件中读出, 这样可以避免因读取不及时而丢失数据.
//
extern int COMx_Read(unsigned char buf[], int len, unsigned int timeout);
//
// 3、清空接收BUF
//
extern void COMx_Purge(void);
//
// 4、显示信息
//
// extern void ShowInfo(char *info);
void ShowInfo(char *info)
{
return;
}
// 5、变量及预定义
// 模组地址或口令如有修改, 应从上位机的配置中读取
unsigned char g_Chipaddr[4] = {0xFF, 0xFF, 0xFF, 0xFF, };
unsigned char g_Password[4] = {0x00, 0x00, 0x00, 0x00, };
// 通讯BUF
#define SIZE_COMM_BUF 64
unsigned char g_fmTxbuf[SIZE_COMM_BUF];
unsigned char g_fmRxbuf[SIZE_COMM_BUF];
unsigned short g_fmTxlen, g_fmRxlen; // , g_fmDatalen;
unsigned char g_fmMBIndex[32]; // 模组上的模板索引
unsigned char g_flagloop; // 循环标志
/**************************************************************************
* Functon
***************************************************************************/
//=================================================================================
// 功能: 计算检验码
// 参数: 待计算数据, 长度
// 返回值: 检验码
//=================================================================================
unsigned short Get_CheckSum(unsigned char buf[], int len)
{
int i;
unsigned short sum = 0;
for(i=0; i<len; i++)
sum += buf[i];
return sum;
}
//=================================================================================
// 功能: 发送指令
// 全局变量:
// g_fmTxbuf从POS_CMDCODE开始填写命令码及参数
// g_fmTxlen表示命令码及参数的长度
// 返回值:
// 0 :成功
// 负数:通讯失败
//=================================================================================
int Send_Command(void)
{
unsigned short nChecksum;
g_fmTxbuf[0] = 0xEF;
g_fmTxbuf[1] = 0x01;
memcpy(g_fmTxbuf + 2, g_Chipaddr, 4);
g_fmTxbuf[6] = CMD_PACKAGE;
g_fmTxbuf[7] = ((g_fmTxlen + 2) >> 8) & 0xFF;
g_fmTxbuf[8] = ((g_fmTxlen + 2) & 0xFF);
nChecksum = Get_CheckSum(g_fmTxbuf + 6, g_fmTxlen + 3);
g_fmTxbuf[POS_CMDCODE + g_fmTxlen] = (nChecksum >> 8) & 0xFF;
g_fmTxbuf[POS_CMDCODE + g_fmTxlen + 1] = (nChecksum & 0xFF);
if(COMx_Write(g_fmTxbuf, POS_CMDCODE + g_fmTxlen + 2) != RT_OK) return -2;
return 0;
}
//=================================================================================
// 功能: 接收响应
// 全局变量:
// g_fmRxbuf从POS_RSPCODE为返回的应答码及参数
// g_fmRxlen表示应答码及参数的长度
// 参数: 超时时长, 单位毫秒
// 返回值:
// 0 :成功
// 负数:通讯失败
// 正数:执行失败,参数协议返回码
//=================================================================================
int Recv_Respond(unsigned int timeout)
{
unsigned short nChecksum, nLen;
int iRet;
do {
iRet = COMx_Read(g_fmRxbuf, 1, timeout);
if(iRet == RT_OVERTIME) return -1;
if(g_fmRxbuf[0] == 0xEF) break;
} while(1);
iRet = COMx_Read(g_fmRxbuf + 1, POS_RSPCODE - 1, COM_IntervalTimeout);
if(iRet == RT_OVERTIME) return -1;
if(g_fmRxbuf[1] != 0x01) return -3;
nLen = ((unsigned short)g_fmRxbuf[7] << 8) + g_fmRxbuf[8];
if(nLen > SIZE_COMM_BUF - POS_RSPCODE) return -4;
if(g_fmRxbuf[6] != RSP_PACKAGE) return -5;
iRet = COMx_Read(g_fmRxbuf + POS_RSPCODE, nLen, COM_IntervalTimeout);
if(iRet == RT_OVERTIME) return -1;
nChecksum = Get_CheckSum(g_fmRxbuf + 6, nLen + 1);
if(nChecksum != (((unsigned short)g_fmRxbuf[POS_RSPCODE + nLen - 2] << 8) + g_fmRxbuf[POS_RSPCODE + nLen - 1])) return -6;
g_fmRxlen = nLen - 2;
return 0;
}
//=================================================================================
// 功能: 执行指令
// 参数:
// timeout : 超时时长, 单位毫秒
// fMode : 预留
// 返回值:
// 0 :成功
// 负数:通讯失败
// 正数:执行失败,参数协议返回码
//=================================================================================
int Exec_Command(unsigned int timeout, int fMode)
{
int iRet;
COMx_Purge();
iRet = Send_Command();
if(iRet != 0) return iRet;
iRet = Recv_Respond(timeout);
if(iRet != 0) return iRet;
return 0;
}
//=================================================================================
// 功能: 获取图像
// 一般判断0为成功, 非0为失败, 这样模组升级时失败码变化不影响应用.
// 返回值:
// 00 :成功
// 02 :无手指
// 03 :面积太小, 新版本才支持这个代码
//=================================================================================
unsigned char cmd_GetImage(void)
{
int iRet;
memset(g_fmTxbuf, 0x00, sizeof(g_fmTxbuf));
memset(g_fmRxbuf, 0x00, sizeof(g_fmRxbuf));
g_fmTxbuf[POS_CMDCODE] = CMD_GETIMAGE;
g_fmTxlen = 1;
iRet = Exec_Command(250, 0);
if(iRet != ERR_OK) return iRet;
return g_fmRxbuf[POS_RSPCODE];
}
//=================================================================================
// 功能: 获取注册图像
// 一般判断0为成功, 非0为失败, 这样模组升级时失败码变化不影响应用.
// 返回值:
// 00 :成功
// 02 :无手指
// 03 :面积太小, 新版本才支持这个代码
//=================================================================================
unsigned char cmd_GetEnrollImage(void)
{
int iRet;
memset(g_fmTxbuf, 0x00, sizeof(g_fmTxbuf));
memset(g_fmRxbuf, 0x00, sizeof(g_fmRxbuf));
g_fmTxbuf[POS_CMDCODE] = CMD_GETENROLLIMAGE;
g_fmTxlen = 1;
iRet = Exec_Command(250, 0);
if(iRet != ERR_OK) return iRet;
return g_fmRxbuf[POS_RSPCODE];
}
//=================================================================================
// 功能: 生成特征文件
// 参数:
// nBufferID : 文件ID, 取值1 - 4
//=================================================================================
unsigned char cmd_GenChar(unsigned char nBufferID)
{
int iRet;
memset(g_fmTxbuf, 0x00, sizeof(g_fmTxbuf));
memset(g_fmRxbuf, 0x00, sizeof(g_fmRxbuf));
g_fmTxbuf[POS_CMDCODE] = CMD_GENCHAR;
g_fmTxbuf[POS_CMDCODE + 1] = nBufferID;
g_fmTxlen = 2;
iRet = Exec_Command(500, 0);
if(iRet != ERR_OK) return iRet;
return g_fmRxbuf[POS_RSPCODE];
}
//=================================================================================
// 功能: 1:1比对
// 参数:
// nScore : 返回比对分数
//=================================================================================
unsigned char cmd_Match(unsigned short *nScore)
{
int iRet;
memset(g_fmTxbuf, 0x00, sizeof(g_fmTxbuf));
memset(g_fmRxbuf, 0x00, sizeof(g_fmRxbuf));
g_fmTxbuf[POS_CMDCODE] = CMD_MATCH;
g_fmTxlen = 1;
iRet = Exec_Command(200, 0);
if(iRet != ERR_OK) return iRet;
*nScore = (g_fmRxbuf[POS_RSPCODE + 1] << 8) + g_fmRxbuf[POS_RSPCODE + 2];
return g_fmRxbuf[POS_RSPCODE];
}
//=================================================================================
// 功能: 1:N比对
// 参数:
// nBufferID : 特征缓冲区(默认为1)
// nStartPage : 起始页(即指纹索引)
// nPageNum : 页数(搜索范围)
// nPageID : 返回匹配索引
// nScore : 返回匹配分数
//============================================================================
评论0