急、急——有关IC卡读入的问题 (200分)

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

mashi7822

Unregistered / Unconfirmed
GUEST, unregistred user!
本人正在做一考勤系统,采用SLE4428IC卡。读卡器所附说明书中对读卡中字符串的函数声明如下:
SLE4428_ReadChar(WORD _wAddr,WORD _wLength,BYTE *_bReadData);
参数:_wAddr 指定要读取的字符串在卡片存储区内的起始地址。
_wLength 指定要读取的字符串长度。SLE4418/SLE4428存储区的长度为1024字节。
_bReadData字符型指针,指向从卡片存储区内读到的字符串并返回给应用程序。
返回值:如果函数调用成功,返回值为0,且_bReadData的内容为从卡片读取到的字符串。
如果函数调用失败,返回值不为0。
说明:此函数从卡片内的_wAddr地址起读取_wLength字节长的字符串,并存储在_bReadData指针内返回给应用程序。
本人在Delphi5中调用该函数如下
//声明该函数
Function SLE4428_ReadChar(wAddr,wLength:Integer;bReadData:pchar) :integer; stdcall;external 'MCS_SR.dll';
//调用
procedure TForm1.Button1Click(Sender: TObject);
var
str1:array[0..255] of char;
i:integer;
begin
i:=SLE4428_ReadChar(32,40,str1);
end;
出现的问题是返回的i值不为0,也即读不到数。本人十分着急,特向各位大侠请教。
注:对卡的初始化串口、关闭串口、下电这三个函数能够正常调用。
而调用上电函数则和前面提到的读卡中字符串函数出现的问题一样。


 
需要设置password
 
没错,我使用的是加密存储器卡。但是在读卡时应该不需要密码,只在写卡时需要密码。
别人曾用VB帮我测试过,都没问题。源代码如下:
Public Declare Function MCS_InitComm Lib "MCS_SR" (ByVal bPort As Byte, ByVal dwCommBaudRate As Long) As Integer
Public Declare Function MCS_ExitComm Lib "MCS_SR" () As Integer
Public Declare Function MCS_LED Lib "MCS_SR" (ByVal bOnOff As Byte) As Integer
Public Declare Function SLE4428_OpenCard Lib "MCS_SR" (ByVal bATR As String) As Integer
Public Declare Function SLE4428_CloseCard Lib "MCS_SR" () As Integer
Public Declare Function SLE4428_ReadChar Lib "MCS_SR" (ByVal wAddr As Integer, ByVal wLength As Integer, ByVal bReadData As String) As Integer

Private Sub Command1_Click()
Dim st As Integer
Dim ops As String * 5
Call MCS_InitComm(0, 115200)
st = SLE4428_OpenCard(ops)
If st = 0 Then
MCS_LED (2)
End If
End Sub

Private Sub Command2_Click()
MCS_LED (1)
Call SLE4428_CloseCard
Call MCS_ExitComm
End Sub

我做的考勤软件是用Delphi5,现在就剩下与读卡器连接部分了,请各位大侠救命。谢谢!
 
再没有人做过SLE4428卡的Delphi开发吗?
只要能给我点提示我也愿意给分,拜托各位!
 
可能是你读取的那段没有内容。
 
“可能是你读取的那段没有内容。”
请问是什么意思?是指我的代码没给全吗?
 
我全部的程序是这样的:
unit Unit3;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm3 = class(TForm)
Button3: TButton;
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form3: TForm3;
implementation
Function MCS_InitComm(bPort:integer;dwCommBaudRate:integer) :integer;
stdcall;external'MCS_SR.dll';
Function MCS_ExitComm :integer;
stdcall;external'MCS_SR.dll';
Function MCS_SetStringMode(bStringMode:integer) :Integer;
stdcall;external'MCS_SR.dll';
Function MCS_LED (bOnOff:integer):Integer;
stdcall;external'MCS_SR.dll';
Function SLE4428_OpenCard(bATR:pchar):integer;
stdcall;external'MCS_SR.dll';
Function SLE4428_CloseCard :integer;
stdcall;external'MCS_SR.dll';
Function SLE4428_ReadChar(wAddr:Integer;wLength:Integer;bReadData:pchar) :integer;
stdcall;external'MCS_SR.dll';

{$R *.DFM}

procedure TForm3.Button3Click(Sender: TObject);
var
str1:array[0..255] of char;
str2:array[0..255] of char;
r:integer;
begin
MCS_InitComm(0,115200); //串口1,波特率为115200
SLE4428_OpenCard(str1); //给卡上电
r:=SLE4428_ReadChar(60,10,str2); //读卡
if r=0 then MCS_LED(2) //如果读卡成功则绿灯亮
else MCS_LED(1); //如果读卡不成功则红灯亮
SLE4428_CloseCard; //给卡下电
MCS_ExitComm ; //关闭通讯
end;

结果是绿灯一直不亮。
 
各位老大,如果嫌分数不够的话我明天就给加分。
 
函数声明是否对?
 
我用SLE4428做过计算机机房管理系统,
如果你将分全给我,
我就将相关的代码mail给你,
你留个E_mail吧。。。
我这两天就给你发过去。。。
 
to zyb:
好的,wangliang79319@sina.com
 
to wrf:
我不能肯定我的函数声明都对,因为我没有Delphi的例子。
 
因为用VB转的话,只有你自己试了,祝你好运吧
 
zyb老兄,您什么时候能给我发过来啊?
 
我现在也在写一个IC的程序。我看你的函数声明有问题,一般DLL有两种调用一种是动态调用一种是静态调用
以下是我的函数声明
interface
const ICDll32 = 'ICDLL32.DLL';
function LinkCom(Port: integer): Integer;stdcall;external ICDll32 name 'link_com';
function UnLinkCom: Integer; stdcall; external ICDll32 name 'unlink_com';
function PowerOn: Integer; stdcall; external ICDll32 name 'power_on';
function PowerOff: Integer; stdcall; external ICDll32 name 'power_off';
function InqStatus(CStatus: string): Integer; stdcall; external ICDll32 name 'inq_status';
function SelCard(CardStyle: Integer): Integer; stdcall; external ICDll32 name 'sel_card';
function SelPage(PageIndex: Integer): Integer; stdcall; external ICDll32 name 'sel_page';
function ReadCard(AreaNo,HAddr,LAddr,Bytes: Integer; CRet: string): Integer; stdcall; external ICDll32 name 'rd_card';
function ReadCardC(AreaNo,HAddr,LAddr,Bytes: Integer; CRet: string): Integer; stdcall; external ICDll32 name 'rd_cardc';
function WriteCard(AreaNo,HAddr,LAddr,Bytes: Integer; CRet: string): Integer; stdcall; external ICDll32 name 'wr_card';
function WriteCardC(AreaNo,HAddr,LAddr,Bytes: Integer; CRet: string): Integer; stdcall; external ICDll32 name 'wr_cardc';

 
给个初值
 
把函数Function SLE4428_ReadChar(wAddr,wLength:Integer;bReadData:pchar) :integer;的参数该为引用传递。
如:Function SLE4428_ReadChar(var wAddr:integer;var wLength:Integer;var bReadData:pchar) :integer;
还有问题,请send e_mail to me!
 
谢谢各位了,问题已解决。
 
后退
顶部