Delphi使用HD9632读卡器能检测到卡,但不能读出卡号,不能继续写卡,请大家帮忙,急等,在线!!(100分)

  • 主题发起人 主题发起人 mervyn807
  • 开始时间 开始时间
M

mervyn807

Unregistered / Unconfirmed
GUEST, unregistred user!
本人用HD9632的读写卡气,操作M1(IC类型)的卡,程序已经打开了串口,能够识别读写卡器,能够识别到有没有卡在上面,但读不出卡号,这个函数不能正常执行,程序没办法往下进行,也写不了卡也读不了卡,一天了,请大家帮忙,我会尽量多送分的
急需!
我可以提供HD9632的接口函数给大家,希望帮写个简单的例子
能读出卡的信息和写卡就行
3.1库函数说明
3.1.1获取动态库版本号
原型:int WINAPI lib_ver(unsigned int *nVer)
参数:*nVer:2字节动态库版本号
返回:成功返回0
3.1.2 DES算法加密函数
原型:int (WINAPI* des_encrypt)(unsigned char *szOut, unsigned char *szIn , unsigned int
inlen, unsigned char *key, unsigned int keylen);
参数:szOut: 输出的DES值,长度等于明文长度
szIn: 明文
inlen: 明文长度,8字节的整数倍
key: 密钥
keylen: 密钥长度,如果大于8字节,是3des,如果小于等于8字节单des.不足补零
返回:成功返回0
3.1.3 DES算法解密算法函数
原型:int (WINAPI* des_decrypt)(unsigned char *szOut, unsigned char *szIn , unsigned int
inlen, unsigned char *key, unsigned int keylen);
参数:szOut: 输出的DES值,长度等于密文长度
szIn: 密文
inlen: 密文长度,8字节的整数倍
key: 密钥
keylen: 密钥长度,如果大于8字节,是3des,如果小于等于8字节单des.不足补零
返回:成功返回0
3.1.4初始化串口
原型:int WINAPI rf_init_com (int port,long baud)
参数:port:串口号,取值为1~4
baud:为通讯波特率4800~115200
返回:成功返回0
3.1.5指定设备标识
原型:int WINAPI rf_init_device_number (unsigned short icdev)
参数:icdev:通讯设备标识符,0-65536
返回:成功返回0
3.1.6读取设备标识
原型:int WINAPI rf_get_device_number (unsigned short *Icdev)
参数:icdev:存放返回通讯设备标识符
返回:成功返回0
3.1.7读取读写卡器硬件版本号
原型:int WINAPI rf_get_model (unsigned short icdev, unsigned short *Version)
参数:icdev: 通讯设备标识符,0-65536
Version: 存放返回版本信息
返回:成功返回0
3.1.8读取读写卡器产品序列号
原型:int WINAPI rf_get_snr (unsigned short icdev, unsigned char *Snr)
参数:icdev: 通讯设备标识符,0-65536
Snr: 存放返回读写卡器产品序列号
返回:成功返回0
3.1.9蜂鸣
原型:int WINAPI rf_beep (unsigned short icdev, unsigned char msec)
参数:icdev: 通讯设备标识符,0-65536
msec: 蜂鸣时限,单位是10 毫秒
返回:成功返回0
3.1.10设置读写卡器SAM卡通讯波特率
原型:int WINAPI rf_init_sam (unsigned short icdev, unsigned char bound)
参数:icdev: 通讯设备标识符,0-65536
bound: sam 卡波特率,取值为9600、38400
返回:成功返回0
3.1.11复位SAM卡
原型:int WINAPI rf_sam_rst(unsigned short icdev, unsigned char *pData, unsigned char *pMsgLg)
参数:icdev: 通讯设备标识符,0-65536
pDate: 返回的复位信息内容
pMsgLg: 返回复位信息的长度
返回:成功返回0
3.1.12向SAM发送COS命令
原型:int WINAPI rf_sam_cos(unsigned short icdev, unsigned char *command, unsigned char
cmdLen ,unsigned char *pData, unsigned char* Length)
参数:icdev: 通讯设备标识符,0-65536
command: COS命令
cmdLen: COS命令长度
pDate: 卡片返回的数据,含SW1、SW2
pMsgLg: 返回数据长度
返回:成功返回0
3.1.13设置读写卡器非接触工作方式(注:3)
原型:int WINAPI rf_init_type (unsigned short icdev, unsigned char type)
参数:icdev:通讯设备标识符,0-65536
type: 读写卡器工作方式
返回:成功返回0
说明:type='A':设置为TYPE_A方式
type='B':设置为TYPE_B方式
type='r': 设置为AT88RF020卡方式
3.1.14设置读写卡器天线状态
原型:int WINAPI rf_antenna_sta (unsigned short icdev, unsigned char model)
参数:icdev:通讯设备标识符,0-65536
model:天线状态
返回:成功返回0
说明:model=0:关闭天线
model=1:开启天线
3.1.15寻TYPE_A卡(注:1)
原型:int WINAPI rf_request (unsigned short icdev, unsigned char model, unsigned short *TagType)
参数:icdev:通讯设备标识符,0-65536
model: 寻卡模式
TagType:返回卡类型值
返回:成功返回0
说明:mode=0x26:寻未进入休眠状态的卡
mode=0x52:寻所有状态的卡
3.1.16 TYPE_A卡防冲撞(注:1)
原型:int WINAPI rf_anticoll(unsigned short icdev, unsigned char bcnt, unsigned char *pSnr,
unsigned char* pRLength)
参数:icdev:通讯设备标识符,0-65536
bcnt: 卡序列号字节数,取值4、7、10,Mifare 卡取值4
pSnr: 返回的卡序列号
pRLength:卡序列号长度
返回:成功返回0
3.1.17锁定一张TYPE_A卡(注:1)
原型:int WINAPI rf_select (unsigned short icdev, unsigned char *pSnr, unsigned char srcLen,
unsigned char *Size)
参数:icdev: 通讯设备标识符,0-65536
pSnr: 卡序列号
srcLen: 卡序列号长度,MifareOne卡该值等于4
Size: 返回卡容量
返回:成功返回0
3.1.18命令已激活的TYPE_A卡进入HALT状态(注:1)
原型:int WINAPI rf_halt(unsigned short icdev)
参数:icdev: 通讯设备标识符,0-65536
返回:成功返回0
3.1.19验证MifareOne卡密钥(注:1)
原型:int WINAPI rf_M1_authen
tication2(unsigned short icdev, unsigned char model, unsigned char
block, unsigned char *key)
参数:icdev: 通讯设备标识符,0-65536
model: 密码验证模式
block: 要验证密码的绝对块号
key: 密钥内容,6 字节
返回:成功返回0
说明:model=0x60:验证A密钥
model=0x61:验证B密钥
3.1.20读取MifareOne卡一块数据(注:1)
原型:int WINAPI rf_M1_read (unsigned short icdev, unsigned char block, unsigned char
*pData,unsigned char *pLen)
参数:icdev: 通讯设备标识符,0-65536
block: M1卡绝对块号
pData: 读出数据
pLen: 读出数据的长度
返回:成功返回0
3.1.21写入MifareOne卡一块数据(注:1)
原型:int WINAPI rf_M1_write (unsigned short icdev, unsigned char block, unsigned char *data)
参数:icdev: 通讯设备标识符,0-65536
block: M1卡绝对块号
data: 写入的数据,16 字节
返回:成功返回0
3.1.22将Mifare One卡某一扇区初始化为钱包(注:1)
原型:int WINAPI rf_M1_initval (unsigned short icdev, unsigned char block, long value)
参数:icdev: 通讯设备标识符,0-65536
block: M1卡绝对块号
value: 初始值,16进制,低字节在前
返回:成功返回0
3.1.23读取Mifare One卡钱包值(注:1)
原型:int WINAPI rf_M1_initval (unsigned short icdev, unsigned char block, long value)
参数:icdev: 通讯设备标识符,0-65536
block: M1卡绝对块号
pValue: 返回的值,16进制,低字节在前
返回:成功返回0
3.1.24 Mifare One卡扣款(注:1)
原型:int WINAPI rf_M1_decrement (unsigned short icdev, unsigned char block, long value)
参数:icdev: 通讯设备标识符,0-65536
block: M1卡绝对块号
value: 要扣的值,16进制,低字节在前
返回:成功返回0
3.1.25 Mifare One卡充值(注:1)
原型:int WINAPI rf_M1_decrement (unsigned short icdev, unsigned char block, long value)
参数:icdev: 通讯设备标识符,0-65536
block: M1卡绝对块号
value: 要增加的值,16进制,低字节在前
返回:成功返回0
3.1.26 Mifare One卡数据回传(注:1)
原型:int WINAPI rf_M1_restore (unsigned short icdev, unsigned char block)
参数:icdev: 通讯设备标识符,0-65536
block: M1卡绝对块号
返回:成功返回0
说明:用此函数将指定的块内容传入卡的buffer,然后可用rf_M1transfer()函数将buffer 中数据
再传送到另一块中去
3.1.27 Mifare One卡数据传送(注:1)
原型:int WINAPI rf_M1_transfer (unsigned short icdev, unsigned char block)
参数:icdev: 通讯设备标识符,0-65536
block: M1卡绝对块号
返回:成功返回0
说明:该函数仅在increment、decrement和restore 命令之后调用
3.1.28寻感应区内符合ISO14443 TYPE_A标准的CPU卡并复位(注:1)
原型:int WINAPI rf_typea_rst (unsigned short icdev, unsigned char model, unsigned char
*pData, unsigned char *pMsgLg)
参数:icdev: 通讯设备标识符,0-65536
model: 寻卡方式
pDate: 返回的CSN + 复位信息内容
pMsgLg: 返回数据长度
返回:成功返回0
说明:mode=0x26:寻未进入休眠状态的卡
mode=0x52:寻所有状态的卡
3.1.29寻感应区内符合ISO14443 TYPE_B标准的卡并激活(注:2)
原型:int WINAPI rf_atqb (unsigned short icdev, unsigned char model, unsigned char
*pData,unsigned char *pMsgLg)
参数:icdev: 通讯设备标识符,0-65536
model:: 寻卡方式
pDate: 返回的复位信息内容
pMsgLg: 返回复位信息长度
返回:成功返回0
说明:mode= 0:REQB
mode=1:WUPB
3.1.30向符合ISO14443标准的CPU卡发送COS命令
原型:int WINAPI rf_cos_command (unsigned short icdev, unsigned char *command, unsigned char
cmdLen, unsigned char *pData, unsigned char* pMsgLg)
参数:icdev: 通讯设备标识符,0-65536
command:COS 命令
cmdLen: COS命令长度
pDate: 卡片返回的数据,含SW1、SW2
pMsgLg: 返回数据长度
返回:成功返回0
3.1.31命令已激活的TYPE_B卡进入HALT状态(注:2)
原型:int WINAPI rf_hltb (unsigned short icdev, unsigned long PUPI)
参数:icdev: 通讯设备标识符,0-65536
PUPI: 卡片唯一标识符
返回:成功返回0
3.1.32验证AT88RF020卡密码(注:2)
原型:int WINAPI rf_at020_check (unsigned short icdev, unsigned char *key)
参数:icdev: 通讯设备标识符,0-65536
key: 密码,8 字节
返回:成功返回0
3.1.33读取AT88RF020卡一页数据(注:2)
原型:int WINAPI rf_at020_read (unsigned short icdev, unsigned char page, unsigned char
*pData, unsigned char* pMsgLen)
参数:icdev: 通讯设备标识符,0-65536
page: 页地址,(0~31)
pDate: 返回的数据
pMsgLen:返回数据的长度
返回:成功返回0
3.1.34写入AT88RF020卡一页数据(注:2)
原型:int WINAPI rf_at020_write(unsigned short icdev, unsigned char page, unsigned char *data)
参数:icdev: 通讯设备标识符,0-65536
page: 页地址,(0~31)
date: 要写入的数据,8 字节
返回:成功返回0
3.1.35 AT88RF020卡LOCK(注:2)
原型:int WINAPI rf_at020_lock(unsigned short icdev, unsigned char *data)
参数:icdev: 通讯设备标识符,0-65536
date: 数据,4字节
返回:成功返回0
3.1.36 AT88RF020卡计数(注:2)
原型:int WINAPI rf_at020_count(unsigned short icdev, unsigned char *data)
参数:icdev: 通讯设备标识符,0-65536
date: 数据,6字节
返回:成功返回0
3.1.37命令AT88RF020卡进入HALT状态(注:2)
原型:int WINAPI rf_at020_deselect(unsigned short icdev)
参数:icdev: 通讯设备标识符,0-65536
返回:成功返回0
3.1.38设置指示灯颜色
原型:int WINAPI rf_light(unsigned short icdev, unsigned char color)
参数:icdev: 通讯设备标识符,0-65536
color: 0 = 熄灭
1 = 红色
2 = 绿色
3 = 黄色
返回:成功返回0
3.1.39关闭COM口
原型:int WINAPI rf_ClosePort ( )
返回:成功返回0
注:1。TYPE_B专用读写卡器无此函数
2.Mifare专用读写卡器无此函数
3.仅TYPE_A&TYPE_B兼容读写卡器有此函数
3.2设备标识符
MFHD9632读写卡器支持组网功能,MFHD9632只响应设备标识符与本身相符或设备标识符等于0x0000的指令。
procedure TForm_People_Card.Button_CardClick(Sender: TObject);
Var
I_Com:Integer;//端口号
I_Baud:Integer;//波特率
j:PChar;
buf1:PChar;
// buf1:Array[1..10]of Byte;//存贮卡序列号
Card_Size:PChar;
//返回卡容量
Card_Len:PChar;
status:Integer;
len:Byte;
begin
I_Com:=StrToInt(ComboBox_Com.Text);
I_Baud:=StrToInt(ComboBox_baud.Text);
begin
iRe:=rf_init_com(I_Com,I_Baud);
//Application.ProcessMessages;
if iRe <> 0 then
begin
ShowMessage('打开端口错误!') ;
end ;

status:=rf_init_type(0,'A');
iRe:=rf_request(0,$52,j);
if iRe <> 0 then
begin
ShowMessage('寻卡失败!');
end;

iRe:=rf_anticoll(0,4,buf1,Card_Len);
if iRe <> 0 then
begin
ShowMessage('卡冲突');
end;

{GetMem(pSNR,16);
iRe:=rf_get_snr(0,pSNR);
//Memo1.Lines.Add( '序列号: '+String(pSNR));
//showmessage('序列号:'+String(pSNR));
FreeMem(pSNR,16);
}

status:=rf_select(0,buf1,len,Card_Size);
if status = 0 then
begin
//Memo1.Lines.Add('选卡失败!');
showmessage('选卡成功!')
end
else
showmessage('选卡失败!');

end;

到这里选卡就会失败,不能选卡成功
 
[:(][:(]没人会吗
 
1. buf1,card_size 内存 是在调用者申请 setlength() 或者使用 buf1:array [0..200] of byte ;
b1 :byte ;
传递地址 rtn := rf_select(0, @buf1[0], 4, @b1);//传递地址值
2. len 没有给参数
3. 参考以下vb例子
Private Sub Command1_Click()
Dim i&amp;, j%, port&amp;, baud&amp;, buf1(200) As Byte, b1 As Byte, s1$
port = cb_ckh.ListIndex + 1
If (port = 0) then
lb_info.Caption = "请选择串口号!"
End If
baud = CLng(cb_btl.Text)
If (baud = 0) then
lb_info.Caption = "请选择波特率!"
End If
'打开串口
i = rf_init_com(port, baud)
If (i <> 0) then
lb_info.Caption = "串口号打开失败!"
Exit Sub
End If
'寻卡
i = rf_request(0, &amp;H52, j)
If (i <> 0) then
lb_info.Caption = "寻卡失败!"
Exit Sub
End If
'防冲撞
i = rf_anticoll(0, 4, buf1(0), b1)
If (i <> 0) then
lb_info.Caption = "防冲撞失败!"
Exit Sub
End If
s1 = ""
For i = 0 To b1 - 1
s1 = s1 &amp;
Right("00" &amp;
Hex(buf1(i)), 2)
Next i
tx_kh.Text = s1
'选卡
i = rf_select(0, buf1(0), 4, b1)
If (i <> 0) then
lb_info.Caption = "选卡失败!"
Exit Sub
End If
lb_info.Caption = "选卡成功!"
End Sub
 
你把波特率设为9600试试,还有,最好问读卡器厂家要一个Demo,这样就简单多了。
 
谢谢大家
要到Delphi的例子了
问题总算解决了
开始只有VB和VC的例子
 
多人接受答案了。
 
后退
顶部