问个写卡数据读取问题。分不是问题 急!!

andyzhou1101 2011-08-23 07:06:39
一个写卡的问题。读卡原函数为:

int ReadCard(BYTE com,char * data,char * err);
参数:
com: 串口号,如:com=0表示串口一;com=1表示串口二;
data: 读出的数据(字符串);
err: 错误信息(字符串);
返回: 1: 成功 2: 失败

其中data的格式如下。
写入 / 读出的数据格式说明如下 (共125位):

起始位 结束位 字段说明
0 1 客户卡类型, 固定值“00”
2 7 房间号 000000 – 999999
不足6位时相左对齐,其余用空格补齐。
例如:
房间号“101”
数据格式:“101 ”
8 8 子房间号,可忽略
9 9 房间卡顺序号 1 – 8
新卡为”1”;
复制卡从顺序号2 –8 ,最多可复制7张卡.
10 21 房卡开始时间
写卡 200206131015 为2002年6月13日10时15分
读卡 200206131015 为2002年6月13日10时15分
建议使用当前时间作为新卡的开始时间
*复制卡的开始时间必须是原始卡的开始时间
22 33 房卡结束时间
写卡 200206131015 为2002年6月13日10时15分
读卡 200206131015 为2002年6月13日10时15分
34 35 开锁延时,一般为5,其格式为 “5 ”
36 56 宾客姓名,比如"李文峰"、"迈克.乔丹"、"Kasanbulanc"等,可忽略
57 76 身份证号/信用卡号,比如"430105600818345"、"430105196008183458"、"123Com名字09MYi"等,可忽略
77 85 公司代码,比如"12345678"、"135"、"3Com公司"等,可忽略
86 86 帐务类型:1表示餐帐、2表示房帐、3表示其他帐,其余的值自定义,可忽略
87 99 帐号 (含识别码) ,比如"1234567890Bn"、"帐号98abC12",可忽略
100 110 可用金额,比如"4567.8",可忽略
111 125 扩展设施标志 ,可忽略



问题:读取时不管我怎么定义data,读出来都为空值。请帮忙看下到底应该怎么定义DATA,怎么读取DATA的内容。

谢谢。

分数不是问题

...全文
170 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
maolei7788 2011-08-24
  • 打赏
  • 举报
回复
已经解决。DLL的问题
maolei7788 2011-08-24
  • 打赏
  • 举报
回复
inventer圆凳图纸
maolei7788 2011-08-24
  • 打赏
  • 举报
回复
inventer圆凳图纸
andyzhou1101 2011-08-24
  • 打赏
  • 举报
回复
已经解决。DLL的问题
andyzhou1101 2011-08-24
  • 打赏
  • 举报
回复
继续顶上去
andyzhou1101 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 sgzhou12345 的回复:]
如果你想读取 考勤机 中的数据的话,厂家会你给一个DLL接口的,
但是要是自己想开发的话,就有点难呀???????
[/Quote]

是门锁。DLL是他们封装的 不过这家锁厂由于比较老 现在已经联系不上了
留存下来的文档都没有,就2个函数说明
山东蓝鸟贵薪 2011-08-24
  • 打赏
  • 举报
回复
如果你想读取 考勤机 中的数据的话,厂家会你给一个DLL接口的,
但是要是自己想开发的话,就有点难呀???????
andyzhou1101 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sgzhou12345 的回复:]
想搞破坏呀????????
[/Quote]


???
山东蓝鸟贵薪 2011-08-24
  • 打赏
  • 举报
回复
想搞破坏呀????????
andyzhou1101 2011-08-24
  • 打赏
  • 举报
回复
请高手现身指点
andyzhou1101 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 babydog01 的回复:]
如果你说写入是正常的,你可以将这个反过程做一下。定义一个字符串,将
for i:=0 to Length(data)-1 do
InBufer[i]:=data[i+1];
反过程

var
i:integer;
data:string;
InBufer:array[0..125] of Char;
ErrCode:array[0..254] of Cha……
[/Quote]



babydog01 2011-08-24
  • 打赏
  • 举报
回复
如果你说写入是正常的,你可以将这个反过程做一下。定义一个字符串,将
for i:=0 to Length(data)-1 do
InBufer[i]:=data[i+1];
反过程

var
i:integer;
data:string;
InBufer:array[0..125] of Char;
ErrCode:array[0..254] of Char;

begin
i := ReadCard(0,InBufer,ErrCode);
if i = 1 then
begin
for i:=0 to 125 do
data[i+1]:=InBufer[i];
showmessage(data);
end;
end;

这样试试看
andyzhou1101 2011-08-24
  • 打赏
  • 举报
回复
分数不是问题

可以另开贴
andyzhou1101 2011-08-24
  • 打赏
  • 举报
回复
var
mStime,mETime,mRmno,mName:String;
Ret:Byte;
InBufer:array[0..125] of Char;
ErrCode:array[0..254] of Char;
i:Integer;
data:string;
begin
mRmno:=Edit1.Text;
mName:=Edit3.Text;
dtpkTime.Date:=dtpkDate.Date;
DateTimePicker2.Date:=DateTimePicker1.Date;
mStime:=FormatDateTime('yyyymmddhhnn',DateTimePicker2.Datetime);

mETime:=FormatDateTime('yyyymmddhhnn',dtpkTime.DateTime);
data:='00'+Copy(mRmno+' ',0,6)+
' '+'1'+
mSTime+mETime+
'5 '+
copy(mName+' '+
' '+
' ',0,21)+'3209111982';
data:=copy(data,1,126);

for i:=0 to Length(data)-1 do
InBufer[i]:=data[i+1];

case WriteCard(0,InBufer,ErrCode,0) of
1:
begin
ShowMessage('写入成功!');
Edit2.Text:=Data;
showmessage(String(InBufer));
end;
else
begin

ShowMessage('失败');
end;
end;
end;
babydog01 2011-08-24
  • 打赏
  • 举报
回复
把你的写卡代码也贴出来看看...
andyzhou1101 2011-08-24
  • 打赏
  • 举报
回复
没人关注???
andyzhou1101 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ahlian 的回复:]
ReadCard是C封装的函数吧,C和delphi对函数的定义是有差别的,ReadCard声明时你用
Function ReadCard(com:byte;var data:TICData;Var err:TICError):integer ; 这个试试,其中后两个参数是变量参数,TICData和 TICError通过Type来定义,具体如下:
type
TICData = array……
[/Quote]

应该跟函数定义没关系 因为我写卡的函数变量申明相同。写卡没任何问题 用他们的读卡程序 写的数据正确
比较郁闷
天空的云彩 2011-08-23
  • 打赏
  • 举报
回复
ReadCard是C封装的函数吧,C和delphi对函数的定义是有差别的,ReadCard声明时你用
Function ReadCard(com:byte;var data:TICData;Var err:TICError):integer ; 这个试试,其中后两个参数是变量参数,TICData和 TICError通过Type来定义,具体如下:
type
TICData = array[0..125] of Char ;
TICError= array[0..254] of Char ;

andyzhou1101 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oraclers 的回复:]
把你讀卡的代碼貼出來。
[/Quote]

代码如上

请指教
andyzhou1101 2011-08-23
  • 打赏
  • 举报
回复
var
i:integer;
InBufer:array[0..125] of Char;
ErrCode:array[0..254] of Char;

begin
i := ReadCard(0,InBufer,ErrCode);
if i = 1 then
begin
showmessage(StrPas(@InBufer));
end;
end;
加载更多回复(2)

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧