1. 端口类API

int Syn_OpenPort(int iPortID);

说明: 打开串口/USB口

参数:iPortID [in] 整数,表示端口号。1-16(十进制)为串口,1001-1016(十进制)为USB口,缺省的一个USB设备端口号是1001。

返回值:成功返回0,错误返回见6。

int Syn_ClosePort(int iPortID);

说明: 关闭串口/USB口

参数:iPortID [in] 整数,表示端口号。

返回值:成功返回0,错误返回见6。

int Syn_GetCOMBaud(int iComID,unsigned int *puiBaudRate);

说明: 查看串口的波特率

参数:iPort [in] 整数,表示端口号。此处端口号必须为1-16,表示串口,参见7.1。 puiBaudRate [out] 无符号整数指针,指向普通串口当前波特率, 默认情况下为 115200。

返回值:成功返回0,错误返回见6。

int Syn_SetCOMBaud(int iComID,unsigned int uiCurrBaud,unsigned int uiSetBaud);

说明: 设置串口的波特率

参数:iPort [in] 整数,表示端口号。此处端口号必须为1-16,表示串口。

uiCurrBaud [in] 无符号整数,调用该API前已设置的业务终端与SAM_V通信的波特率(SAM_V出厂时默认,业务终端与SAM_V通信的波特率为115200)。业务终端以该波特率与SAM_V通信,发出设置SAM_V新波特率的命令。uiCurrBaud只能为下列数值之一:115200,57600,38400,19200,9600.如果uiCurrBaud数值不是这些值之一,函数返回0x21;如果已设置的波特率与uiCurrBaud不一致, 则函数返回非零,表示不能设置,调用API不成功。

uiSetBaud [in] 符号整数,将要设置的SAM_V与业务终端通信波特率。uiSetBaud只能取下列值之一:115200,57600,38400,19200,9600,如果输入uiSetBaud参数不是这些数值之一,函数返回非零,设置不成功,保持原来的波特率不变。

返回值:成功返回0,错误返回见6。

2. SAM类API

int Syn_GetSAMStatus(int iPortID,int iIfOpen);

说明: 对SAM_V进行状态检测

参数:iPort [in] 整数,表示端口号。参见7.1。

iIfOpen [in] 整数,参见7.2。

返回值:成功返回0,错误返回见6。

int Syn_ResetSAM(int iPortID,int iIfOpen);

说明: 对SAM_V复位

参数:iPort [in] 整数,表示端口号。参见7.1。

iIfOpen [in] 整数,参见7.2。

返回值:成功返回0,错误返回见6。

int Syn_GetSAMID(int iPortID,unsigned char *pucSAMID,int iIfOpen);

说明: 读取SAM_V的编号(十六进制)

参数:iPort [in] 整数,表示端口号。参见7.1。

pucSAMID [out] 无符号字符串指针,SAM_V编号,16字节。

iIfOpen [in] 整数,参见7.2。

返回值:成功返回0,错误返回见6。

int Syn_GetSAMIDToStr(int iPortID,char *pcSAMID,int iIfOpen);

说明: 读取SAM_V的编号(字符串格式)

参数:iPort [in] 整数,表示端口号。参见7.1。

pcSAMID [out] 字符串指针,SAM_V编号。

iIfOpen [in] 整数,参见7.2。

返回值:成功返回0,错误返回见6。

3. 身份证卡类API

int Syn_StartFindIDCard(int iPortID,unsigned char *pucManaInfo,int iIfOpen);

说明: 开始找卡

参数:iPort [in] 整数,表示端口号。参见7.1。

pucManaInfo [out] 无符号字符指针,证/卡芯片管理号,4个字节。

iIfOpen [in] 整数,参见7.2。

返回值:成功返回0,错误返回见6。

int Syn_SelectIDCard(int iPortID,unsigned char *pucManaMsg,int iIfOpen);

说明: 选卡

参数:iPort [in] 整数,表示端口号。参见7.1。

pucManaMsg [out] 无符号字符指针,证/卡芯片序列号,8个字节。

iIfOpen [in] 整数,参见7.2。

返回值:成功返回0,错误返回见6。

int Syn_ReadMsg(int iPortID,int iIfOpen,IDCardData *pIDCardData);

说明: 读取证/卡信息

参数:iPort [in] 整数,表示端口号。参见7.1。

iIfOpen [in] 整数,参见7.2。

pIDCardData [out] IDCardData类型读出的数据,参见5。

返回值:成功返回0,错误返回见6。

4. 附加类API

int Syn_SendSound(int iCmdNo);

说明: 发送语音

参数:iCmdNo [in] 声音编号

返回值:成功返回0,错误返回见6。

void Syn_DelPhotoFile();

说明: 删除临时照片文件

参数:无

返回值:成功返回0,错误返回见6。

5. 结构体声明

typedef struct tagIDCardData{

char Name[32]; //姓名

char Sex[4]; //性别

char Nation[6]; //名族

char Born[18]; //出生日期

char Address[72]; //住址

char IDCardNo[38]; //身份证号

char GrantDept[32]; //发证机关

char UserLifeBegin[18]; //有效开始日期

char UserLifeEnd[18]; //有效截止日期

char reserved[38]; //保留

char PhotoFileName[255]; //照片路径

}IDCardData;

6.函数返回值

0 操作成功或相片解码解码正确

-1 端口打开失败/端口尚未打开/端口号不合法

-2 证/卡中此项无内容

-3 PC接收超时,在规定的时间内未接收到规定长度的数据

-4 数据传输错误

-5 该SAM_V串口不可用,只在SDT_GetCOMBaud时才有可能返回

-6 接收业务终端数据的校验和错

-7 接收业务终端数据的长度错

-8 接收业务终端的命令错误,包括命令中的各种数值或逻辑搭配错误

-9 越权操作

-10 无法识别的错误

-11 寻找证/卡失败

-12 选取证/卡失败

-13 调用sdtapi.dll错误

-14 相片解码错误

-15 授权文件不存在

-16 设备连接错误

7.注意

7.1系统支持的串行端口号:1-16,USB端口号:1001-1016

7.2 iIfOpen [in] 整数,0表示不在该函数内部打开和关闭串口,此时确保之前调用了Syn_OpenPort来打开端口,并且在不需要与端口通信时,调用Syn_ClosePort关闭端口;非0表示在API函数内部包含了打开端口和关闭端口函数,之前不需要调用Syn_OpenPort,也不用再调用Syn_ClosePort。

7.3 普通开发中只使用“端口类API”与“身份证卡类API” 与“附加类API”就能满足开发需要,

使用方法见第10部分实例。

7.4 在使用Syn_SendSound函数时请先用Syn_ClosePort函数关闭打开的端口。

7.5 SDK包包含文件

Syn_IDCardRead.dll、Syn_IDCardRead.lib、Syn_IDCardRead.h、sdtapi.dll、WltRS.dll

8.声音命令暂时未定

0. 读身份证成功

9.Syn_IDCardRead.h头文件:

#ifdef _WIN32
#define STDCALL __stdcall
#else
#define STDCALL
#endif
#ifndef SDTAPI_
#define SDTAPI_
#ifdef __cplusplus
extern "C"{
#endif
#pragma pack(1)
typedef struct tagIDCardData{
char Name[32];
char Sex[4];
char Nation[6];
char Born[18];
char Address[72];
char IDCardNo[38];
char GrantDept[32];
char UserLifeBegin[18];
char UserLifeEnd[18];
char reserved[38];
char PhotoFileName[255];
}IDCardData;
#pragma pack()
/************************端口类API *************************/
int STDCALL Syn_GetCOMBaud(int iComID,unsigned int *puiBaud);
int STDCALL Syn_SetCOMBaud(int iComID,unsigned int uiCurrBaud,unsigned int uiSetBaud);
int STDCALL Syn_OpenPort(int iPortID);
int STDCALL Syn_ClosePort(int iPortID);
/************************ SAM类API *************************/
int STDCALL Syn_GetSAMStatus(int iPortID,int iIfOpen);
int STDCALL Syn_ResetSAM(int iPortID,int iIfOpen);
int STDCALL Syn_GetSAMID(int iPortID,unsigned char *pucSAMID,int iIfOpen);
int STDCALL Syn_GetSAMIDToStr(int iPortID,char *pcSAMID,int iIfOpen);
/********************身份证卡类API *************************/
int STDCALL Syn_StartFindIDCard(int iPortID,unsigned char *pucManaInfo,int iIfOpen);
int STDCALL Syn_SelectIDCard(int iPortID,unsigned char *pucManaMsg,int iIfOpen);
int STDCALL Syn_ReadMsg(int iPortID,int iIfOpen,IDCardData *pIDCardData);
/********************附加类API *****************************/
int STDCALL Syn_SendSound(int iCmdNo);
void STDCALL Syn_DelPhotoFile();
#ifdef __cplusplus
}
#endif
#endif
}

10.调用实例:

10.1 vc6.0调试通过

void CSampleDlg::OnButton1()
{
// TODO: Add your control notification handler code here
int ifOpen;
int iPort;
int iRet;
unsigned char pucIIN[4];
unsigned char pucSN[8];
IDCardData CardMsg;
ifOpen=0; //是否需要打开串口
iPort=1;
iRet=Syn_OpenPort(iPort);
if (iRet==0)
{
iRet=Syn_StartFindIDCard(iPort,pucIIN,ifOpen);
if (iRet==0)
{
iRet=Syn_SelectIDCard(iPort,pucSN,ifOpen);
if (iRet==0)
{
iRet=Syn_ReadMsg(iPort,0,&CardMsg);
if (iRet==0)
{
//显示读出的信息
UpdateData(true);
m_name=CardMsg.Name;
UpdateData(false);
Syn_SendSound(0);
Syn_DelPhotoFile();
}
}
}
}
Syn_ClosePort(iPort);
}
10.2 delphi7.0调试通过
首先将Syn_IDCardRead.h翻译为Delphi 格式。
procedure TForm1.Button4Click(Sender: TObject);
var
ifOpen:integer;
iPort:integer;
iRet:integer;
pucIIN:array[0..3] of Byte;
pucSN:array[0..7] of Byte;
CardMsg:TCard;
begin
IfOpen:=0; //是否需要打开串口
iPort:=1;
iRet:=Syn_OpenPort(iPort);
if iRet<>0 then
begin
Syn_ClosePort(iPort);
Exit;
end;
iRet:=Syn_StartFindIDCard(iPort,@pucIIN, IfOpen);
if iRet=0 then
begin
iRet:=Syn_SelectIDCard(iPort,@pucSN, IfOpen);
if iRet=0 then
begin
iRet:=Syn_ReadMsg(iPort,0,CardMsg);
if iRet=0 then
begin
label1.Caption:=trim(CardMsg.Name);
label2.Caption:=trim(CardMsg.Sex);
label3.Caption:=trim(CardMsg.Nation);
label4.Caption:=trim(CardMsg.Born);
label5.Caption:=trim(CardMsg.Address);
label6.Caption:=trim(CardMsg.IDCardNo);
label7.Caption:=trim(CardMsg.GrantDept);
label8.Caption:=trim(CardMsg.UserLifeBegin);
label9.Caption:=trim(CardMsg.UserLifeEnd);
label10.Caption:=trim(CardMsg.reserved);
image1.Picture.Bitmap.LoadFromFile(CardMsg.PhotoFileName);
image1.Picture.Bitmap.Transparent := True;
image1.Picture.Bitmap.TransParentColor := image1.Picture.Bitmap.canvas.pixels[5,3];
Syn_SendSound(0);
Syn_DelPhotoFile;
end;
end;
end;
Syn_ClosePort(iPort);
end