功能:实现电脑与读头的485通讯协议。
输入:port为串口号。
jh为机号。
cmd为命令字。
sfile固定为nil(0)。
sbuf为指向发送数据包的指针。
slen为发送数据包长度。
rfile固定为nil(0)。
timeout固定为0。
输出:函数返回0,表示通讯成功;其它见。
stat返回命令执行结果,0表示成功,其它见错误代码表。
rbuf为指向接收数据包的指针。
rlen为接收数据包长度。
例子:以下假设读头机号12,串口号1。
(1)命令字0x02用于检测读头。
var rt:Integer;
stat,rlen:Integer;
rbuf:array[1..16] of Char;
begin
rt:=PC_Call_C(1,12,2,nil,'',0,stat,nil,@rbuf,rlen,0);
if (rt=0) then rt:=stat;
if rt=0 then Application.MessageBox('检测到读头')
else Application.MessageBox('未检测到读头');
end;
(2)命令字0xa8用于检测读头上是否刷过卡。
var rt:Integer;
stat,rlen:Integer;
rbuf:array[1..16] of Char;
begin
rt:=PC_Call_C(1,12,$a8,nil,'',0,stat,nil,@rbuf,rlen,0);
if (rt=0) then rt:=stat;
if rt=0 then Application.MessageBox('检测到卡片')
else Application.MessageBox('未检测到卡片');
end;
(3)命令字0xa9用于读取读头上刷卡卡号。
var rt:Integer;
stat,rlen:Integer;
rbuf:array[1..16] of Char;
id:Integer;
begin
rt:=PC_Call_C(1,12,$a9,nil,'',0,stat,nil,@rbuf,rlen,0);
if (rt=0) then rt:=stat;
if (rt=0) then
begin
PChar(@id)[0]:=rbuf[3];
PChar(@id)[1]:=rbuf[2];
PChar(@id)[2]:=rbuf[1];
PChar(@id)[3]:=rbuf[0];
end;
if rt=0 then Application.MessageBox('读取卡号为'+InttoStr(id),'信息')
else Application.MessageBox('未检测到卡片','信息');
end;
//===============================以上是方法
第一个方法是用来检测读头是否存在的.我知道写在按钮事件下就行.
第二个是检测是否有卡片的.小弟就不知道写在什么事件下了.因为我不知道什么时候刷卡啊.
第三个也是同样的.我不知道什么刷卡.所以不知道事件写在什么地方.当我刷卡的时候我如何触发那个事件啊.帮帮忙.真心求助的
输入:port为串口号。
jh为机号。
cmd为命令字。
sfile固定为nil(0)。
sbuf为指向发送数据包的指针。
slen为发送数据包长度。
rfile固定为nil(0)。
timeout固定为0。
输出:函数返回0,表示通讯成功;其它见。
stat返回命令执行结果,0表示成功,其它见错误代码表。
rbuf为指向接收数据包的指针。
rlen为接收数据包长度。
例子:以下假设读头机号12,串口号1。
(1)命令字0x02用于检测读头。
var rt:Integer;
stat,rlen:Integer;
rbuf:array[1..16] of Char;
begin
rt:=PC_Call_C(1,12,2,nil,'',0,stat,nil,@rbuf,rlen,0);
if (rt=0) then rt:=stat;
if rt=0 then Application.MessageBox('检测到读头')
else Application.MessageBox('未检测到读头');
end;
(2)命令字0xa8用于检测读头上是否刷过卡。
var rt:Integer;
stat,rlen:Integer;
rbuf:array[1..16] of Char;
begin
rt:=PC_Call_C(1,12,$a8,nil,'',0,stat,nil,@rbuf,rlen,0);
if (rt=0) then rt:=stat;
if rt=0 then Application.MessageBox('检测到卡片')
else Application.MessageBox('未检测到卡片');
end;
(3)命令字0xa9用于读取读头上刷卡卡号。
var rt:Integer;
stat,rlen:Integer;
rbuf:array[1..16] of Char;
id:Integer;
begin
rt:=PC_Call_C(1,12,$a9,nil,'',0,stat,nil,@rbuf,rlen,0);
if (rt=0) then rt:=stat;
if (rt=0) then
begin
PChar(@id)[0]:=rbuf[3];
PChar(@id)[1]:=rbuf[2];
PChar(@id)[2]:=rbuf[1];
PChar(@id)[3]:=rbuf[0];
end;
if rt=0 then Application.MessageBox('读取卡号为'+InttoStr(id),'信息')
else Application.MessageBox('未检测到卡片','信息');
end;
//===============================以上是方法
第一个方法是用来检测读头是否存在的.我知道写在按钮事件下就行.
第二个是检测是否有卡片的.小弟就不知道写在什么事件下了.因为我不知道什么时候刷卡啊.
第三个也是同样的.我不知道什么刷卡.所以不知道事件写在什么地方.当我刷卡的时候我如何触发那个事件啊.帮帮忙.真心求助的
解决方案 »
- 谁用delphi+mysql开发过软件?
- 一个关于ClientDataSet的问题
- 求制作椭圆形按扭的控件,我找了好久都没找到....急....谢谢了先
- 我用BDE的TQUERY来运行一个“select * from users;"我想取里面的一个字段怎么 取?
- DELPHI写的一个DLL组件,注册后取消注册但还是要重新开机才能更新,有何时办法?
- canvas上如何使其透明
- DELPHI&OFFICE(OLECONTAINER控件问题??急)
- s:= 'select '+a+ 'from jobs'; ,//为什么我运行的时候说什么找不到存储过程,该怎么修改
- 直接在Server上读出*.txt中的内容,然后进行计算整理,再把整理后的内容,返回给Client,用Socket能实现吗?
- 高难度,好刺激.送分给你。
- char控件画图 我的数据都是正数 放大看某个数时 下面的负数表格怎么样让它不显示呢?目的就是让它从0开始!
- 我想使用鍵盤enter?怎么辦?沒分了,無奈。下次一定记的回帖的人補分給你們。
2、看你的业务逻辑,如果说是点击一个按钮,就读卡的,这个函数要写在读卡之前,检测是否有卡片。
3、前面一样的答复,需要看你的业务逻辑,你想怎么实现。