ZLG500B 读卡模块上位机库函数使用说明.docx
《ZLG500B 读卡模块上位机库函数使用说明.docx》由会员分享,可在线阅读,更多相关《ZLG500B 读卡模块上位机库函数使用说明.docx(19页珍藏版)》请在冰豆网上搜索。
ZLG500B读卡模块上位机库函数使用说明
ZLG500B读卡模块上位机库函数使用说明
一、演示软件的使用
开始进入系统时界面如下图
1.设置连接参数
开始进行操作时,首先从设置菜单中选择参数选择选项默认端口为1,波特率为9600,如果不需要修改参数则可以略过此步骤。
此时会弹出一个对话框从中选择所需要设置的参数
2.连接
接着从文件菜单中选择连接选项进行连接
连接上后系统界面如下图
此时的操作有两个分支
2.1手工操作
此时的操作界面如上图,只要你选择好要进行操作的各项参数,就可以点击读取数据,写入数据,读取数值,写入数值和加减按钮进行操作了(注:
你可以直接双击左边树列表框中的某个数据块来直接选择此数据块)
2.2循环测试
要进行循环操作时首先从文件菜单中选择循环测试按钮
此时弹出一个对话框
从中你可以选择你循环测试时所要进行的操作点确定后界面如下图
此时你可以点击循环测试按钮进行测试,注意在这之前首先得确保你已经选择好要进行操作的各项参数,在循环操作中已经设置好的各项参数都不能改变,要改变只能先中止循环测试,再进行更改。
你只要把卡放到感应区就能自动进行指定的操作,要中止循环测试,则只需再次选择文件菜单中的循环测试选项即可。
循环测试选项前打勾表示已经选择,未打勾表示没有选择。
二、库函数说明及其使用
1.库函数说明
1.1unsignedchar__stdcallzlg500B_init(intnport,intnbaud)
入口参数
nport:
串口号1234分别表示com1,com2,com3,com4
nbaud:
波特率只能选9600,19200,28800,57600
函数功能此函数的功能是打开串口并设置波特率
1.2void__stdcallzlg500B_exit(void)
入口参数
无
函数功能此函数的功能是关闭串口
1.3unsignedchar__stdcallzlg500B_request(unsignedcharmode,unsignedshort
&tagtype)
入口参数
mode:
请求类型
mode=0:
请求天线范围内IDLE状态的卡HALT状态的除外
mode=1:
请求天线范围内的所有卡
tagtype:
返回的目标类型
函数功能:
此函数发送Request命令检查在有效范围内是否有卡的存在
返回值0:
表示成功否则返回错误码
1.4unsignedchar__stdcallzlg500B_anticoll(unsignedcharbcnt,unsignedlong&snr)
入口参数
bcnt:
为预选卡所分配的位的个数通常Bcnt=0
snr:
返回卡的序号
函数功能:
此函数开始防冲突操作
返回值0:
表示成功否则返回错误码
1.5unsignedchar__stdcallzlg500B_anticoll2(unsignedcharencoll,unsignedchar
bcnt,unsignedlong&snr)
入口参数
encoll:
若为1则使能多张卡进入天线区;若为0则不允许多张卡进入,此时返回错误MI_COLLERR
bcnt:
为预选卡所分配的位的个数,通常Bcnt=0
snr:
返回卡的序号
函数功能:
此函数开始防冲突操作
返回值0:
表示成功否则返回错误码
1.6unsignedchar__stdcallzlg500B_select(unsignedlongsnr,unsignedchar&size)
入口参数
snr:
卡的序号
size:
返回卡的容量
函数功能:
此函数选择某一个序号的卡
返回值0:
表示成功否则返回错误码
1.7unsignedchar__stdcallzlg500B_authentication(unsignedcharmode,unsignedchar
secnr)
入口参数
mode:
密钥类型,密钥A:
0x00,密钥B:
0x04
secnr:
要验证的卡扇区号
函数功能:
此函数将RC500中的密匙与卡中的密匙进行验证,在进行对卡片的读写操作之前,必须成功执行此指令,在系统初始化时主控设备将把每个扇区的密码加载到读卡器中
返回值0:
表示成功否则返回错误码
1.8unsignedchar__stdcallzlg500B_authentication2(unsignedcharmode,unsignedchar
secnr,unsignedcharkeynr)
入口参数
mode:
密钥类型,密钥A:
0x00,密钥B:
0x04
secnr:
要验证的卡扇区号
keynr:
用于证实的密匙区号
函数功能:
此函数将RC500中的密匙与卡中的密匙进行验证,在进行对卡片的读写操作之前必须成功执行此指令,在系统初始化时主控设备将把每个扇区的密码加载到读卡器中
返回值0:
表示成功否则返回错误码
1.9unsignedchar__stdcallzlg500B_halt(void)
入口参数
无
函数功能:
此函数使被选择的卡产生一个暂停,即使之处于Halt模式,处于Halt模式的卡只能用ALL方式进行选择
返回值0:
表示成功否则返回错误码
1.10unsignedchar__stdcallzlg500B_read(unsignedcharaddr,unsignedchar*data)
入口参数
addr:
块号(0x00--0x3f)
data:
块数据长度16个字节
函数功能:
此函数功能是读取卡的一个块的数据
返回值0:
表示成功否则返回错误码
1.11unsignedchar__stdcallzlg500B_write(unsignedcharaddr,unsignedchar*data)
入口参数
addr:
块号(0x00--0x3f)
广州周立功单片机发展有限公司Tel:
(020)3873097638730977Fax:
38730925
data:
块数据长度16个字节
函数功能:
此函数功能是对指定的块进行整块写操作
返回值0:
表示成功否则返回错误码
1.12unsignedchar__stdcallzlg500B_increment(unsignedcharaddr,long&value)
入口参数
addr:
块号(0x00--0x3f)
value:
要加上的值
函数功能:
该函数读被访问的值块检查数据的结构,用传输的值减值块的值并将结果贮存在卡的内部寄存器中,值块有标准的格式,不能自动进行对卡中EEPROM的写操作
返回值0:
表示成功否则返回错误码
1.13unsignedchar__stdcallzlg500B_decrement(unsignedcharaddr,long&value)
入口参数
addr:
块号(0x00--0x3f)
value:
要减去的值
函数功能此函数功能是给一个块减去一个值
返回值该函数读被访问的值块检查数据的结构用传输的值减值块的值并将结果贮存在卡的内部寄存器中值块有标准的格式不能自动进行对卡中EEPROM的写操作
1.14unsignedchar__stdcallzlg500B_writeval(unsignedcharaddr,longvalue)
入口参数
addr:
块号(0x00--0x3f)
value:
要写入的值
函数功能:
此函数往一个块中写入数值
返回值0:
表示成功否则返回错误码
1.15unsignedchar__stdcallzlg500B_readval(unsignedcharaddr,long&value)
入口参数
addr:
块号(0x00--0x3f)
value:
存储要读出的值
函数功能:
此函数读出一个块中的数值
返回值0:
表示成功否则返回错误码
1.16unsignedchar__stdcallzlg500B_authKey(unsignedcharmode,unsignedcharsecnr,
unsignedchar*key);
入口参数
mode:
密钥类型,密钥A:
0x00,密钥B:
0x04
secnr:
要验证的卡扇区号
key:
用于证实的密匙
函数功能:
在对卡进行读写加减等操作前,必须对卡进行验证,若卡中的密钥与所传输的密码相匹配则证实成功,函数将返回MI_OK
返回值0:
表示成功否则返回错误码
1.17unsignedchar__stdcallzlg500B_restore(unsignedcharaddr)
入口参数
addr:
所读块的地址(0x00--0x3f)
函数功能:
该函数读被访问的值块且检查数据的结构,并将结果贮存在卡的内部寄存器中,不能自动进行对卡中EEPROM的写操作
返回值0:
表示成功否则返回错误码
1.18unsignedchar__stdcallzlg500B_transfer(unsignedcharaddr)
入口参数
addr:
卡中欲传输的块地址(0x00--0x3f)
函数功能:
此函数将卡的内部寄存器内容转送给所选块地址,在此操作前必须通过验证这个函数只能在Increment,Decrement,或Restore操作后
返回值0:
表示成功否则返回错误码
1.19unsignedchar__stdcallzlg500B_value(unsignedcharmode,unsignedcharaddr,long
&value,unsignedchartrans_addr)
入口参数
mode:
模式1字节加C1H减C0H复制C2H
addr:
块号(0x00--0x3f)
value:
要操作的值
trans_addr:
传输块地址
函数功能:
此函数功能是对一个块进行值操作并把结果存到trans_addr中
返回值0:
表示成功否则返回错误码
1.20unsignedchar__stdcallzlg500B_load_key(unsignedcharmode,unsignedchar
secnr,unsignedchar*key)
入口参数
mode:
密钥类型,密钥A:
0x00,密钥B:
0x04
secnr:
要载入的读卡器中的密钥区号
key:
密码长度6个字节
函数功能:
这条指令的功能是将RC500中的密匙与卡中的密匙进行验证,在进行对卡片的读写操作之前必须成功执行此指令,在系统初始化时主控设备将把每个扇区的密码加载到读卡器中
返回值0:
表示成功否则返回错误码
1.21unsignedchar__stdcallzlg500B_reset(unsignedcharmsec)
入口参数
msec:
射频电路关闭时间以毫秒为单位
函数功能:
该函数使射频电路关闭所规定的时间,若msec=0射频电路部分将一直处于关闭状态,一直到下一个Request命令到来,关闭射频能使天线内的所有卡复位
返回值0:
表示成功否则返回错误码
1.22unsignedchar__stdcallzlg500B_close(void)
入口参数
无
函数功能:
此函数将RC500的复位管脚置为高电平,关闭RC500使之电流最小,若要重新启动则需调用Config()
返回值0:
表示成功否则返回错误码
1.23unsignedchar__stdcallzlg500B_config(void)
入口参数
无
函数功能:
模块每次上电复位之后都必须首先调用此函数对模块进行初始化,才能进行进一步的操作
返回值0:
表示成功否则返回错误码
1.24unsignedchar__stdcallzlg500B_get_info(unsignedchar*info)
入口参数
info:
info[0]-info[4]为RC500的产品类型标识依次为0x30,0x88,0xf8,0x00,0xXX
info[5]-info[8]为RC500的序列号
函数功能:
此函数返回一个包含有RC500的产品类型标识和序列号的数组
返回值0:
表示成功否则返回错误码
1.25unsignedchar__stdcallzlg500B_check_write(unsignedcharsnr,unsignedchar
authenmode,unsignedcharaddr,unsignedchar*data)
入口参数
Snr:
所要检查的卡的序号
Authenmod:
上一次写命令时的验证模式
Addr:
所要检查的数据块的地址
Data:
所检查的数据
函数功能:
此函数对写入卡的数据进行检查,将重新进行Request/Select/Authenticated操作,此函数进行将所给出的数据与相应地址的数据进行比较,如果正确则返回MIS_CHK_OK信息,如果两者间数据不相符则返回MIS_CHK_COMPERR信息,发生其它任何错误时返回MIS_CHK_FAILED信息,注:
验证密匙时所用的密匙区与块addr所在的扇区号相同
返回值0:
表示成功否则返回错误码
1.26unsignedchar__stdcallzlg500B_set_control_bit()
入口参数无
函数功能:
此函数设置MIFARE读卡器中的控制位为高电平
返回值0:
表示成功否则返回错误码
1.27unsignedchar__stdcallzlg500B_clr_control_bit()
入口参数无
函数功能:
此函数清除MIFARE读卡器中的控制位
返回值0:
表示成功否则返回错误码
1.28unsignedchar__stdcallzlg500B_buzzer(unsignedcharfrquence,unsignedchar
opentm,unsignedcharclosetm,unsignedcharrepcnt)
入口参数
frequence:
输出方波频率取值0-255对应频率0.73-4K0为直流198对应2K
opentm:
方波输出持续时间取值0-25510ms的分辨率
closetm:
间隙时间取值0-25510ms的分辨率
repcnt:
重复次数
函数功能:
此函数输出一方波或低电平可驱动蜂鸣器频率持续时间间隙时间和重复次数可调
下面是频率对照表
frequence输出频率KHz
0输出低电平直流
10.735
200.787
400.847
600.913
800.990
1001.081
1201.198
1401.333
1601.515
1801.74
2002.04
2202.50
2403.17
2554.00
返回值0:
表示成功否则返回错误码
1.29unsignedchar__stdcallzlg500B_read_E2(unsignedcharaddr,unsignedchar
length,unsignedchar*data)
入口参数
Addr:
被读RC500内EEPROM首址必须小于0x80
Length:
被读数据长度
Data:
读出数据缓冲区首址
函数功能:
此函数将RC500内EEPROM的数据读出
返回值0:
表示成功否则返回错误码
1.30unsignedchar__stdcallzlg500B_write_E2(unsignedcharaddr,unsignedchar
length,unsignedchar*data)
入口参数
Addr:
RC500内EEPROM的写入首址取值范围0x30-0x7E
Length:
被写数据长度
Data:
写入数据缓冲区首址
函数功能:
此函数将数据写入RC500内,EEPROM中RC500内EEPROM的0x00-0x0F为只读产品信息区;0x10-0x2F为启动寄存器初始化文件区,最好不要改写;0x80-0x1FF为只读密钥区,可用LoadKey写入;0x7F为模块波特率参数存贮区,最好不要改写
返回值0;表示成功否则返回错误码
2.库函数使用方法
2.1调用动态库方法
首先把库函数文件都放到工作目录中总共有三个文件zlg500B.hzlg500B.libzlg500B.dll
2.1.1VC隐式调用动态库的方法
1.在.CPP中包含zlg500B.h头文件
2.在工程文件中加入zlg500B.lib文件
2.1.2VC显式调用动态库的方法
要显式调用动态库,首先得调用LoadLibrary函数来加载zlg500B.dll,用完后调用FreeLibrary函数来卸载之;比如你要调用库中的unsignedchar__stdcallzlg500B_read(unsignedcharaddr,unsignedchar*data)这个函数则可以按照以下步骤来调用:
typedefunsignedchar(CALLBACK*LPZLGB_READ)(unsignedchar,unsignedchar*);
HANDLEm_hDLL=LoadLibrary("zlg500B");
LPZLGB_READzlg500B_read;
zlg500B_read=(LPZLGB_READ)GetProcAddress(m_hDLL,"zlg500B_read");
unsignedcharaddr=0;
unsignedcharrecbuff[16];
zlg500B_read(1,recbuff);//调用zlg500B_read函数.
FreeLibrary(m_hDLL);
2.1.3VB调用动态库的方法
通过以下方法进行声明后就可以调用了
语法:
[Public|Private]DeclareFunctionnameLib"libname"[Alias"aliasname"][([arglist])][Astype]
Declare语句的语法包含下面部分
Public可选用于声明在所有模块中的所有过程都可以使用的函数
Private可选用于声明只能在包含该声明的模块中使用的函数
Name必选任何合法的函数名动态链接库的入口处entrypoints区分大小写
Libname必选包含所声明的函数动态链接库名或代码资源名
Alias可选表示将被调用的函数在动态链接库(DLL)中还有另外的名称,当外部函数名与某个函数重名时就可以使用这个参数,当动态链接库的函数与同一范围内的公用变量常数或任何其它过程的名称相同时也可以使用Alias,如果该动态链接库函数中的某个字符不符合动态链接库的命名约定时也可以使用Alias,Aliasname可选动态链接库如果首字符不是数字符号(#)则aliasname是动态链接库中该函数入口处的名称,如果首字符是(#)则随后的字符必须指定该函数入口处的顺序号,Arglist可选代表调用该函数时需要传递参数的变量表;Type可选Function返回值的数据类型可以是ByteBooleanIntegerLongCurrencySingleDoubleDecimal,目前尚不支持DateString,只支持变长或Variant用户定义类型或对象类型。
arglist参数的语法如下:
[Optional][ByVal|ByRef][ParamArray]varname[()][Astype]
部分描述:
Optional可选表示参数不是必需的,如果使用该选项则arglist中的后续参数都必需是可选的,而且必须都使用Optional关键字声明,如果使用了ParamArray则任何参数都不能使用Optional
ByVal可选表示该参数按值传递
ByRef可选表示该参数按地址传递
例如PublicDeclareFunctionzlg500B_readLib"zlg500B"(ByValblocknrAsByte,ByRefdataAsByte)AsByte
2.2库函数使用流程
zlg500B_read
zlg500B_Request
zlg500B_Anticoll
zlg500B_Select
zlg500B_authentication
zlg500B_write
zlg500B_increment
zlg500B_decrement
zlg500B_init
zlg500B_readval
zlg500B_writeval
zlg500B_value
zlg500B_exit
zlg500B_halt
2.3使用举例
#include“zlg500B.h”
unsignedcharcardaddrlen;
unsignedcharcardaddr[255];
unsignedlongsnr;
unsignedcharcardaddr;
unsignedshorttype;
unsignedcharsize;
unsignedchardata[16];
unsignedcharszpwd[6]={0xff,0xff,0xff,0xff,0xff,0xff};
for(inti=0;i<16;i++)
{
data[i]=i;
}
longvalue=0x500;
zlg500B_init(1,9600);//打开端口和设定波特率
zlg500B_config();
zlg500B_load_key(0,0,szpwd);//往第0密钥区装载密钥A
sleep
(2);//操作间延时2ms可以修改
while
(1)
{
if(zlg500B_request(0,type)!
=0)//对第一个读卡器进行操作
continue;
sleep
(2);
if(zlg500B_anticoll(0,snr)!
=0)//进行防碰撞选择成功则返回卡号
continue;
sleep
(2);
if(zlg500B_select(snr,size)!
=0)//选择卡
continue;
sleep
(2);
if(zlg500B_authentication(0,0)!
=0)//验证第0扇区的密钥A
continue;
sleep
(2);
if(zlg500B_wirte(2,data)!
=0)//往第二块写入数据
continue;
sleep
(2);
if(zlg500B_read(2,data)!
=0)//读取第二块的数据
continue;
sleep
(2);
for(i=0;i<16;i++)
{
printf("%x",data[i]);
}
printf("\n");
if(zlg500B_writeval(1,val