一个写卡的问题。读卡原函数为: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的内容。谢谢。分数不是问题

解决方案 »

  1.   

    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.   

     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 ;
      

  3.   

    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;
      

  4.   

    如果你说写入是正常的,你可以将这个反过程做一下。定义一个字符串,将
      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;这样试试看
      

  5.   

    如果你想读取 考勤机 中的数据的话,厂家会你给一个DLL接口的,
    但是要是自己想开发的话,就有点难呀???????
      

  6.   


    是门锁。DLL是他们封装的 不过这家锁厂由于比较老 现在已经联系不上了 
    留存下来的文档都没有,就2个函数说明