本人正在做一个S100D考勤机的接口程序,由于厂家说这款机器已停产不提供服务了,所以遇到问题现在无法解决。下面是调用的接口,从网上搜索到的 {*Lanben 智能卡函数库 Delphi 声明单元*} unit Lanben; interface
uses
Windows, SysUtils; const
SOK = 'OK';
SERROR = 'ERROR';
SOVER = 'OVER';
Lanben_API = 'Lanben10.dll'; // 自定义通信错误常量
ERROR_IO_CHECK=$00000001; //校验错误
ERROR_IO_READ=$00000002; //读错误
ERROR_IO_WRITE=$00000003; //写错误
ERROR_IO_NOEND=$00000004; //串口接收未结束而中断
ERROR_IO_NOPEN=$00000005; //不能打开端口
ERROR_IO_COMMAND=$00000006; //命令错误
ERROR_IO_NOHANDLE=$00000007; //无句柄错误
ERROR_IO_TIMEOUT=$00000008; //通讯超时 type
PClockInfo = ^TClockInfo;
TClockInfo = record
hPort: THandle;
clock_id: Byte;
Ver: string;
ICID: BOOL;
Fireware: Double;
RunMode: Integer;
Port, BaudRate, SelType, Model, Clock_Type: integer;
Block, CmdVerify, Connected, bSelected: Boolean;
end; {设备联接类} // 打开端口及联接设备
function ConnectClock(Port, BaudRate: Integer; ClockNo: Byte; BroadCast: Boolean=False): THandle; stdcall; external lanben_API
// Port : 端口号, COM1=1, COM2=2;
// BaudRate : 波特率, 一般为9600
// ClockNo : 为机号, 范围0-252
// BroadCast : 为开始群发功能, 不接收返回状态
// 说明 : 返回值为端口句柄, 当返回-1时表示端口无效或是被占用, 返回0时代表无法联机 // 断开联接及关闭端口
function DisConnectClock(hPort: THandle): Boolean; stdcall; external Lanben_API
// 此函数和ConnectClock 对应 // 检查指定的机器是否在联机状态
function CheckConnectClock(hPort: THandle; ClockNo: Byte; BroadCast: Boolean=False): Byte; stdcall; external Lanben_API
// ClockNo : 为机号, 0-252
// BroadCast : 为开始群发功能, 不接收返回状态
// 说明 : 返回机器运行模式, 只能是下列值
// Return=0 联接不成功
// Return=1 考勤机, Return=2考勤门禁机, Return=3门禁机, Return=4份饭机 // 联接指定的机器
function CallClock(hPort: THandle; ClockNo: Byte; BroadCast: Boolean=False): Byte; stdcall; external Lanben_API
// ClockNo : 为机号, 0-252
// BroadCast : 为开始群发功能, 不接收返回状态
// 说明 : 返回机器运行模式, 只能是下列值
// Return=0 联接不成功
// Return=1 考勤机, Return=2考勤门禁机, Return=3门禁机, Return=4份饭机 // 取消联接机器
function UnCallClock(hPort: THandle): Boolean; stdcall; external Lanben_API // 查询指定机号是否在线
function TestCallClock(hPort: THandle; ClockNo: Byte; ATimeOut: Integer=0): Byte; stdcall; external Lanben_API
// ClockNo : 为机号, 0-252
// ATimeOut : 响应超时
// 说明 : 返回机器运行模式, 只能是下列值
// Return=0 联接不成功
// Return=1 考勤机, Return=2考勤门禁机, Return=3门禁机, Return=4份饭机 // 机器复位
function ResetClock(hPort: THandle): Boolean;stdcall; external Lanben_API
// 将卡钟复位到出厂状态,复位会清除所有数据和下载名单 // 读设备型号参数
function GetClockParam(hPort: THandle; var Model: Integer; var Fireware: Double; var ICID: BOOL): Boolean; stdcall; external Lanben_API
// 自动识别机器型号, 一般在联机后马上调用以使DLL识别型号 // 手动设置型号参数
function SetClockParam(hPort: THandle; Model: Integer; Fireware: Double; ICID: BOOL): Boolean; stdcall; external Lanben_API
// 手动设置机器型号, 自动识别机型失败时调用 // 修改设备通信速率
function SetClockBaudRate(hPort: THandle; BaudRate: DWORD): Boolean; stdcall; external Lanben_API
// BaudRate : 波特率, 初始值为9600, 可以有以下值:
// 9600, 19200, 38400 // 设置端口超时时间
function SetPortTimeOut(Value: Integer): Boolean; stdcall; external Lanben_API
// Value : 超时值, 毫秒为单位, 默认为1000毫秒, // 设置IC卡读写卡操作的超时时间
function SetPortRWCardTimeOut(hPort: THandle; Value: Integer): Boolean; stdcall; external Lanben_API
// Value : 超时值, 毫秒为单位, 默认为30000毫秒,
设备联接类}
// 设置机器编号及运行模式
function SetClockID(hPort: THandle; ClockID: Byte; RunMode: Integer=0): Boolean; stdcall; external Lanben_API
// ClockID : 新机号
// RunMode : 新设备运行模式(参见CallClock返回值) // 取得设备编号
function GetClockID(Port, BaudRate: Integer;var ClockID: Byte): Boolean; stdcall; external Lanben_API
// ClockID : 返回机号
// 读取设备时间
function ReadClockTime(hPort: THandle; var CurTime: Double): Boolean; stdcall; external Lanben_API // 设置设备时间
function SetClockTime(hPort: THandle; SetTime: Double): Boolean; stdcall; external Lanben_API
========================================================================我写了一个简单的获取时间的动作,但是一直获取不到,代码如下:procedure TForm1.Button1Click(Sender: TObject);
var
hPort:THandle;
COMID:THandle;
CCID:Byte;
CurTime:double;
ret:Byte;
TryTimes:integer;
IsOK:boolean; Model: Integer;
Fireware: Double;
ICID: BOOL; getcurtime:TDateTime;
datacount:integer;
begin
COMID:=strtoint(edit1.text);
CCID:=strtoint(edit2.text); if SetPortTimeOut(1000) then
memo1.Lines.Add('SetPortTimeOut OK!')
else
memo1.Lines.Add('SetPortTimeOut error!'); hport:=ConnectClock(comid,9600,ccid);
if hport>0 then
begin
sleep(500);
ret:=CheckConnectClock(hport,ccid);
sleep(500);
if ret>0 then
begin
ret:=TestCallClock(hport,ccid,100); if ret>0 then
begin
curtime:=0;
TryTimes:=3;
IsOK:=false;
sleep(500);
TryTimes:=20;
sleep(500);
repeat
IsOK:=ReadClockTime(hport,CurTime);
sleep(100);
dec(TryTimes);
until (IsOK)or(TryTimes<=0); if IsOk then
memo1.Lines.Add('Read Time ok!')
else
memo1.Lines.Add('Read Time Error!'); end;
end
else
showmessage('联机失败!'); DisConnectClock(hport);
end
else
showmessage('打开串口失败!');
end;
请有做过这个机器接口的朋友指点一下,谢了!
uses
Windows, SysUtils; const
SOK = 'OK';
SERROR = 'ERROR';
SOVER = 'OVER';
Lanben_API = 'Lanben10.dll'; // 自定义通信错误常量
ERROR_IO_CHECK=$00000001; //校验错误
ERROR_IO_READ=$00000002; //读错误
ERROR_IO_WRITE=$00000003; //写错误
ERROR_IO_NOEND=$00000004; //串口接收未结束而中断
ERROR_IO_NOPEN=$00000005; //不能打开端口
ERROR_IO_COMMAND=$00000006; //命令错误
ERROR_IO_NOHANDLE=$00000007; //无句柄错误
ERROR_IO_TIMEOUT=$00000008; //通讯超时 type
PClockInfo = ^TClockInfo;
TClockInfo = record
hPort: THandle;
clock_id: Byte;
Ver: string;
ICID: BOOL;
Fireware: Double;
RunMode: Integer;
Port, BaudRate, SelType, Model, Clock_Type: integer;
Block, CmdVerify, Connected, bSelected: Boolean;
end; {设备联接类} // 打开端口及联接设备
function ConnectClock(Port, BaudRate: Integer; ClockNo: Byte; BroadCast: Boolean=False): THandle; stdcall; external lanben_API
// Port : 端口号, COM1=1, COM2=2;
// BaudRate : 波特率, 一般为9600
// ClockNo : 为机号, 范围0-252
// BroadCast : 为开始群发功能, 不接收返回状态
// 说明 : 返回值为端口句柄, 当返回-1时表示端口无效或是被占用, 返回0时代表无法联机 // 断开联接及关闭端口
function DisConnectClock(hPort: THandle): Boolean; stdcall; external Lanben_API
// 此函数和ConnectClock 对应 // 检查指定的机器是否在联机状态
function CheckConnectClock(hPort: THandle; ClockNo: Byte; BroadCast: Boolean=False): Byte; stdcall; external Lanben_API
// ClockNo : 为机号, 0-252
// BroadCast : 为开始群发功能, 不接收返回状态
// 说明 : 返回机器运行模式, 只能是下列值
// Return=0 联接不成功
// Return=1 考勤机, Return=2考勤门禁机, Return=3门禁机, Return=4份饭机 // 联接指定的机器
function CallClock(hPort: THandle; ClockNo: Byte; BroadCast: Boolean=False): Byte; stdcall; external Lanben_API
// ClockNo : 为机号, 0-252
// BroadCast : 为开始群发功能, 不接收返回状态
// 说明 : 返回机器运行模式, 只能是下列值
// Return=0 联接不成功
// Return=1 考勤机, Return=2考勤门禁机, Return=3门禁机, Return=4份饭机 // 取消联接机器
function UnCallClock(hPort: THandle): Boolean; stdcall; external Lanben_API // 查询指定机号是否在线
function TestCallClock(hPort: THandle; ClockNo: Byte; ATimeOut: Integer=0): Byte; stdcall; external Lanben_API
// ClockNo : 为机号, 0-252
// ATimeOut : 响应超时
// 说明 : 返回机器运行模式, 只能是下列值
// Return=0 联接不成功
// Return=1 考勤机, Return=2考勤门禁机, Return=3门禁机, Return=4份饭机 // 机器复位
function ResetClock(hPort: THandle): Boolean;stdcall; external Lanben_API
// 将卡钟复位到出厂状态,复位会清除所有数据和下载名单 // 读设备型号参数
function GetClockParam(hPort: THandle; var Model: Integer; var Fireware: Double; var ICID: BOOL): Boolean; stdcall; external Lanben_API
// 自动识别机器型号, 一般在联机后马上调用以使DLL识别型号 // 手动设置型号参数
function SetClockParam(hPort: THandle; Model: Integer; Fireware: Double; ICID: BOOL): Boolean; stdcall; external Lanben_API
// 手动设置机器型号, 自动识别机型失败时调用 // 修改设备通信速率
function SetClockBaudRate(hPort: THandle; BaudRate: DWORD): Boolean; stdcall; external Lanben_API
// BaudRate : 波特率, 初始值为9600, 可以有以下值:
// 9600, 19200, 38400 // 设置端口超时时间
function SetPortTimeOut(Value: Integer): Boolean; stdcall; external Lanben_API
// Value : 超时值, 毫秒为单位, 默认为1000毫秒, // 设置IC卡读写卡操作的超时时间
function SetPortRWCardTimeOut(hPort: THandle; Value: Integer): Boolean; stdcall; external Lanben_API
// Value : 超时值, 毫秒为单位, 默认为30000毫秒,
设备联接类}
// 设置机器编号及运行模式
function SetClockID(hPort: THandle; ClockID: Byte; RunMode: Integer=0): Boolean; stdcall; external Lanben_API
// ClockID : 新机号
// RunMode : 新设备运行模式(参见CallClock返回值) // 取得设备编号
function GetClockID(Port, BaudRate: Integer;var ClockID: Byte): Boolean; stdcall; external Lanben_API
// ClockID : 返回机号
// 读取设备时间
function ReadClockTime(hPort: THandle; var CurTime: Double): Boolean; stdcall; external Lanben_API // 设置设备时间
function SetClockTime(hPort: THandle; SetTime: Double): Boolean; stdcall; external Lanben_API
========================================================================我写了一个简单的获取时间的动作,但是一直获取不到,代码如下:procedure TForm1.Button1Click(Sender: TObject);
var
hPort:THandle;
COMID:THandle;
CCID:Byte;
CurTime:double;
ret:Byte;
TryTimes:integer;
IsOK:boolean; Model: Integer;
Fireware: Double;
ICID: BOOL; getcurtime:TDateTime;
datacount:integer;
begin
COMID:=strtoint(edit1.text);
CCID:=strtoint(edit2.text); if SetPortTimeOut(1000) then
memo1.Lines.Add('SetPortTimeOut OK!')
else
memo1.Lines.Add('SetPortTimeOut error!'); hport:=ConnectClock(comid,9600,ccid);
if hport>0 then
begin
sleep(500);
ret:=CheckConnectClock(hport,ccid);
sleep(500);
if ret>0 then
begin
ret:=TestCallClock(hport,ccid,100); if ret>0 then
begin
curtime:=0;
TryTimes:=3;
IsOK:=false;
sleep(500);
TryTimes:=20;
sleep(500);
repeat
IsOK:=ReadClockTime(hport,CurTime);
sleep(100);
dec(TryTimes);
until (IsOK)or(TryTimes<=0); if IsOk then
memo1.Lines.Add('Read Time ok!')
else
memo1.Lines.Add('Read Time Error!'); end;
end
else
showmessage('联机失败!'); DisConnectClock(hport);
end
else
showmessage('打开串口失败!');
end;
请有做过这个机器接口的朋友指点一下,谢了!
1。打开串口 OpenCommPort
2。连机 CallClock
3。调用相关函数
4。关闭串口 DisConnectClock不要用 ConnectClock ,这个函数有问题