Einzelnen Beitrag anzeigen

WARP4

Registriert seit: 3. Aug 2006
7 Beiträge
 
Delphi XE2 Professional
 
#4

AW: USB - Drittanbiter Gerät benutzen

  Alt 3. Sep 2013, 08:42
Ganz kurz aus meiner Erfahrung mit einem RFID - Reader:

Wenn der Reader seriell angesprochen werden kann (z.B. virtueller COM-Port über USB), einfach eine Komponente für serielle Kommunikation beutzen. Gibt es einige...google mal nach DELPHI und serial Communication library). Es gibt freie und kommerzielle...

Diese haben überlicherweise bereits eingebaute Events für z.B. onReceiveData die die empfangenen Zeichen zur Verfügung stellen und besitzen Methoden für das Öffnen, Schliessen des COM-Ports und das Senden von Daten (meist als ASCII-String).
Was an den Reader gesendet werden muss und wie er antwortet muss allerdings bekannt sein (meist durch den Hersteller des Readers zu bekommen).

Für das Empfangen sah bas bei mir prinzipiell so aus (bitte nur als Schema sehen, es ist nach den damaligen Vorgaben des Reader-Herstellers mal so erzeugt worden ...).

Code:
//------------------------------------------------------------------------------
// Handle OnReceiveData event of the CommPortDriver
procedure TfmMain.CommPortDriverMainReceiveData(Sender: TObject;
  DataPtr: Pointer; DataSize: Cardinal);
var
  P: PChar;
begin
  P:=DataPtr;
  while DataSize > 0 do
  begin
    case P^ of
    #13:begin //CR Detection
          _RecvDataBuild:= _RecvDataBuild + P^;
        end;
    #10:begin //LF Detection, data fully received
          _RecvDataBuild:= _RecvDataBuild + P^;
          ReceiveDataStr:= _RecvDataBuild;
          _RecvDataBuild:= ''; //Prepare for new data to be fetched

          AddLineToComLog( ReceiveDataStr , clBlack);

          RxdHasAck:= Pos('ack',ReceiveDataStr) > 0; //is there a "ack" in received string ?
          RxdHasNak:= Pos('nak',ReceiveDataStr) > 0; //is there a "nak" in received string ?
        end;
    else
      _RecvDataBuild:= _RecvDataBuild + P^; //Accumulate received data
    end;
    inc(P);
    dec(DataSize);
  end;
end;

...und so für das Senden von Daten:
Code:
//------------------------------------------------------------------------------
// Send a string to the reader / writer device and log the string into the
// logbook
procedure TfmMain.SendStringToReaderWriter(aSendStr: String);
begin
  if CommPortDriverMain.Connected then
  begin
    CommPortDriverMain.SendString( aSendStr );
    AddLineToComLog( #09 + aSendStr , clBlack);
  end;
end;
Gruss Warp
  Mit Zitat antworten Zitat