我自己想做个会员辨认的软件给自己用,所以买了ACR122 NFC的读写器. 里面的简单例子有个函数,我觉得是读写的,但是例子运行后,自己实在找不出写一个值进去,然后读这个值,麻烦好心的老师给我看下这函数,教我写一个数值进去,然后读这个值.这函数百度里也可以找到,我就是看不懂. SCardTransmit 下面我复制它的代码.function SendAPDU(): integer;
var index: integer; tempstr: String;
begin  ioRequest.dwProtocol := dwActProtocol;
  ioRequest.cbPciLength := sizeof(SCARD_IO_REQUEST);  tempstr := '';
  for index := 0 to SendLen - 1 do
    tempstr := tempstr + Format('%.02X ', [SendBuff[index]]);
  DisplayOut(tempstr,3);  retCode := SCardTransmit(hCard,
                           @ioRequest,
                           @SendBuff,
                           SendLen,
                           Nil,
                           @RecvBuff,
                           @RecvLen);
  if retcode <> SCARD_S_SUCCESS then begin
    DisplayOut(GetScardErrMsg(retcode),2);
    SendAPDU := retcode;
    Exit;
  end;  tempstr := '';
  for index := 0 to RecvLen - 1 do
    tempstr := tempstr + Format('%.02X ', [RecvBuff[index]]);  DisplayOut(tempstr, 4);  SendAPDU := retcode;end;

解决方案 »

  1.   

    下面是整个例子的代码.unit MiFareProg;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, AcsModule, StdCtrls, ComCtrls;const MAX_BUFFER_LEN    = 256;type
      TfrmMifare = class(TForm)
        Label1: TLabel;
        cbReader: TComboBox;
        rbOutput: TRichEdit;
        btnInit: TButton;
        btnConnect: TButton;
        LoadGroup: TGroupBox;
        Label2: TLabel;
        Label3: TLabel;
        tbKeyNum: TEdit;
        tbKeyVal1: TEdit;
        tbKeyVal2: TEdit;
        tbKeyVal3: TEdit;
        tbKeyVal4: TEdit;
        tbKeyVal5: TEdit;
        tbKeyVal6: TEdit;
        btnLoad: TButton;
        AuthenGroup: TGroupBox;
        Label4: TLabel;
        Label5: TLabel;
        KeyGroup: TGroupBox;
        rKeyA: TRadioButton;
        rKeyB: TRadioButton;
        tbBlockNum: TEdit;
        btnAuthen: TButton;
        tbAuthenKeyNum: TEdit;
        BinaryGroup: TGroupBox;
        Label6: TLabel;
        tbBinaryBlockNum: TEdit;
        tbLen: TEdit;
        Label7: TLabel;
        Label8: TLabel;
        tbData: TEdit;
        tbRead: TButton;
        tbUpdate: TButton;
        ValueGroup: TGroupBox;
        Label9: TLabel;
        Label10: TLabel;
        Label11: TLabel;
        Label12: TLabel;
        tbValueBlockNum: TEdit;
        tbSource: TEdit;
        tbTarget: TEdit;
        btnStore: TButton;
        btnInc: TButton;
        btnDec: TButton;
        btnReadValue: TButton;
        btnRestore: TButton;
        tbValue: TEdit;
        btnClear: TButton;
        btnReset: TButton;
        btnQuit: TButton;
        procedure btnInitClick(Sender: TObject);
        procedure btnConnectClick(Sender: TObject);
        procedure tbKeyNumKeyPress(Sender: TObject; var Key: Char);
        procedure tbKeyVal1KeyPress(Sender: TObject; var Key: Char);
        procedure tbKeyVal2KeyPress(Sender: TObject; var Key: Char);
        procedure tbKeyVal3KeyPress(Sender: TObject; var Key: Char);
        procedure tbKeyVal4KeyPress(Sender: TObject; var Key: Char);
        procedure tbKeyVal5KeyPress(Sender: TObject; var Key: Char);
        procedure tbKeyVal6KeyPress(Sender: TObject; var Key: Char);
        procedure btnLoadClick(Sender: TObject);
        procedure btnAuthenClick(Sender: TObject);
        procedure tbReadClick(Sender: TObject);
        procedure tbUpdateClick(Sender: TObject);
        procedure btnStoreClick(Sender: TObject);
        procedure btnReadValueClick(Sender: TObject);
        procedure btnIncClick(Sender: TObject);
        procedure btnDecClick(Sender: TObject);
        procedure btnRestoreClick(Sender: TObject);
        procedure btnQuitClick(Sender: TObject);
        procedure btnClearClick(Sender: TObject);
        procedure btnResetClick(Sender: TObject);
        procedure FormActivate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmMifare: TfrmMifare;
      hContext            : SCARDCONTEXT;
      hCard               : SCARDCONTEXT;
      ioRequest           : SCARD_IO_REQUEST;
      retCode             : Integer;
      dwActProtocol, BufferLen  : DWORD;
      SendBuff, RecvBuff        : array [0..262] of Byte;
      SendLen, RecvLen, nBytesRet : DWORD;
      Buffer      : array [0..MAX_BUFFER_LEN] of char;
      ATRVal              : array [0..128] of byte;
      ATRLen              : ^DWORD;implementation{$R *.dfm}procedure DisplayOut(output: String; mode: integer);
    begin  case mode of
        1: frmMifare.rbOutput.SelAttributes.Color := clBlue;
        2: frmMifare.rbOutput.SelAttributes.Color := clRed;
        3: begin
              frmMifare.rbOutput.SelAttributes.Color := clBlack;
              output := '<< ' + output;
           end;
        4: begin
              frmMifare.rbOutput.SelAttributes.Color := clBlack;
              output := '>> ' + output;
           end;
      end;  frmMifare.rbOutput.Lines.Add(output);
      frmMifare.rbOutput.SelAttributes.Color := clBlack;
      frmMifare.rbOutput.SetFocus;end;procedure ClearBuffers();
    var index: integer;
    begin  for index := 0 to 262 do
        begin
          SendBuff[index] := $00;
          RecvBuff[index] := $00;
        end;end;function SendAPDU(): integer;
    var index: integer; tempstr: String;
    begin  ioRequest.dwProtocol := dwActProtocol;
      ioRequest.cbPciLength := sizeof(SCARD_IO_REQUEST);  tempstr := '';
      for index := 0 to SendLen - 1 do
        tempstr := tempstr + Format('%.02X ', [SendBuff[index]]);
      DisplayOut(tempstr,3);  retCode := SCardTransmit(hCard,
                               @ioRequest,
                               @SendBuff,
                               SendLen,
                               Nil,
                               @RecvBuff,
                               @RecvLen);
      if retcode <> SCARD_S_SUCCESS then begin
        DisplayOut(GetScardErrMsg(retcode),2);
        SendAPDU := retcode;
        Exit;
      end;  tempstr := '';
      for index := 0 to RecvLen - 1 do
        tempstr := tempstr + Format('%.02X ', [RecvBuff[index]]);  DisplayOut(tempstr, 4);  SendAPDU := retcode;end;procedure Initialize();
    begin  frmMifare.btnInit.Enabled := true;
      frmMifare.btnConnect.Enabled := false;
      frmMifare.LoadGroup.Enabled := false;
      frmMifare.AuthenGroup.Enabled := false;
      frmMifare.BinaryGroup.Enabled := false;
      frmMifare.ValueGroup.Enabled := false;
      frmMifare.rKeyA.Checked := true;
      frmMifare.cbReader.Clear;
      frmMifare.tbKeyNum.Text := '';
      frmMifare.tbKeyVal1.Text := '';
      frmMifare.tbKeyVal2.Text := '';
      frmMifare.tbKeyVal3.Text := '';
      frmMifare.tbKeyVal4.Text := '';
      frmMifare.tbKeyVal5.Text := '';
      frmMifare.tbKeyVal6.Text := '';
      frmMifare.tbBlockNum.Text := '';
      frmMifare.tbAuthenKeyNum.Text := '';
      frmMifare.tbBinaryBlockNum.Text := '';
      frmMifare.tbAuthenKeyNum.Text := '';
      frmMifare.tbData.Text := '';
      frmMifare.tbValue.Text := '';
      frmMifare.tbValueBlockNum.Text := '';
      frmMifare.tbSource.Text := '';
      frmMifare.tbTarget.Text := '';
      frmMifare.rbOutput.Clear;
      DisplayOut('Program ready', 1);
      
    end;procedure TfrmMifare.btnInitClick(Sender: TObject);
    var index: integer;
    begin  //Establish context
      retCode := SCardEstablishContext(SCARD_SCOPE_USER,
                                       nil,
                                       nil,
                                       @hContext);
      if retCode <> SCARD_S_SUCCESS then begin
        displayout(GetScardErrMsg(retcode),2);
        Exit;
      end ;  //List PC/SC readers installed in the system
      BufferLen := MAX_BUFFER_LEN;
      retCode := SCardListReadersA(hContext,
                                   nil,
                                   @Buffer,
                                   @BufferLen);
      if retCode <> SCARD_S_SUCCESS then begin
        DisplayOut(getscarderrmsg(retCode),2);
        Exit;
      end;  btnInit.Enabled := false;
      btnConnect.Enabled := true;  LoadListToControl(cbReader,@buffer,bufferLen);
      // Look for ACR128 PICC and make it the default reader in the combobox
      for index := 0 to cbReader.Items.Count-1 do begin
        cbReader.ItemIndex := index;
        if AnsiPos('ACR122U PICC', cbReader.Text) > 0 then
          Exit;
      end;
      cbReader.ItemIndex := 0;end;procedure TfrmMifare.btnConnectClick(Sender: TObject);
    begin  //Connect to reader using a shared connection
      retCode := SCardConnectA(hContext,
                               PChar(cbReader.Text),
                               SCARD_SHARE_SHARED,
                               SCARD_PROTOCOL_T0 or SCARD_PROTOCOL_T1,
                               @hCard,
                               @dwActProtocol);  if retcode <> SCARD_S_SUCCESS then begin
        displayout(GetScardErrMsg(retcode),2)
      end
      else begin
        displayout('Successful connection to ' + cbReader.Text, 1)
      end;  frmMifare.btnConnect.Enabled := false;
      frmMifare.LoadGroup.Enabled := true;
      frmMifare.AuthenGroup.Enabled := true;
      frmMifare.BinaryGroup.Enabled := true;
      frmMifare.ValueGroup.Enabled := true;end;procedure TfrmMifare.tbKeyNumKeyPress(Sender: TObject; var Key: Char);
    begin
      if Key <> chr($08) then begin
        if Not (Key in ['0'..'9'])then
          Key := Chr($00);
      end;
    end;procedure TfrmMifare.tbKeyVal1KeyPress(Sender: TObject; var Key: Char);
    begin
      if Key <> chr($08) then begin
        if Key in ['a'..'z'] then
          Dec(Key, 32);
        if Not (Key in ['0'..'9', 'A'..'F'])then
          Key := Chr($00);
      end;
    end;procedure TfrmMifare.tbKeyVal2KeyPress(Sender: TObject; var Key: Char);
    begin
      if Key <> chr($08) then begin
        if Key in ['a'..'z'] then
          Dec(Key, 32);
        if Not (Key in ['0'..'9', 'A'..'F'])then
          Key := Chr($00);
      end;
    end;procedure TfrmMifare.tbKeyVal3KeyPress(Sender: TObject; var Key: Char);
    begin
      if Key <> chr($08) then begin
        if Key in ['a'..'z'] then
          Dec(Key, 32);
        if Not (Key in ['0'..'9', 'A'..'F'])then
          Key := Chr($00);
      end;
    end;procedure TfrmMifare.tbKeyVal4KeyPress(Sender: TObject; var Key: Char);
    begin
      if Key <> chr($08) then begin
        if Key in ['a'..'z'] then
          Dec(Key, 32);
        if Not (Key in ['0'..'9', 'A'..'F'])then
          Key := Chr($00);
      end;
    end;procedure TfrmMifare.tbKeyVal5KeyPress(Sender: TObject; var Key: Char);
    begin
      if Key <> chr($08) then begin
        if Key in ['a'..'z'] then
          Dec(Key, 32);
        if Not (Key in ['0'..'9', 'A'..'F'])then
          Key := Chr($00);
      end;
    end;有点长,贴了前面的部分,
      

  2.   

    api里都有sample code了 建议你先去读api
      

  3.   

    主要功能应该就是这个SCardTransmit,
    参数
    ioRequest 这应该是操作的类型,读、写之类的
    SendBuff 发送缓冲区
    RecvBuff 接收缓冲区,接收返回的数据