AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi RFID Lese- und Schreibgerät, geeignet für Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

RFID Lese- und Schreibgerät, geeignet für Delphi

Ein Thema von TheMiller · begonnen am 15. Aug 2012 · letzter Beitrag vom 5. Mai 2015
 
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#11

AW: RFID Lese- und Schreibgerät, geeignet für Delphi

  Alt 15. Aug 2012, 12:09
Es gibt schon API's, allerdings muss man sich doch etwas mit den Spezifikationen beschäftigen, ein Beispiel für eine Obit-Anbindung ....

Delphi-Quellcode:
unit OBIT_Thread;

interface

uses Windows, Classes, FECOM, FERWA;

Type
  T_2 = Array [0 .. 1] of AnsiChar;
  T_256 = Array [0 .. 255] of AnsiChar;

  TTagStatus = Record
    Key: Double;
    Schrank: Integer;
    Locked: Boolean;
    Valid: Boolean;
    Batterie: Integer;
  end;

  TPollBuffer = Record
    cPollAction: T_2;
    cTrAdr: T_2;
    cSendPollData: T_256;
    cPollValid: T_2;
    cRecPollData: T_256;
  end;

  TCallBackFunc = Procedure(Status: TTagStatus);

Type

  TOBID_Thr = Class(TThread)
  private
    PollBuffer: TPollBuffer;
    FCallBackFunc: TCallBackFunc;
    FPortHandle, FReader: Integer;
    FDelay: Integer;
    TagStatus: TTagStatus;
    FLastKey: Double;
  protected
    procedure CallCallBack;
    Function ReadTag: Boolean;
    procedure Debug;
  public
    procedure Execute; override;
    constructor Create(CallBack: TCallBackFunc; Port: PAnsichar;
      Delay: Integer);
    Destructor Destroy; override;
  end;

var
  ObidThread: TOBID_Thr;

implementation

Uses Dialogs, ConstsAndGlobals;

Constructor TOBID_Thr.Create(CallBack: TCallBackFunc; Port: PAnsichar;
  Delay: Integer);
begin
  FDelay := Delay;
  FPortHandle := FECOM_OpenPort(Port);
  FCallBackFunc := CallBack;
  if FPortHandle > 0 then
  begin
    FReader := FERWA_NewReader(FPortHandle);
  end;
  FLastKey := -1;
  inherited Create(False);
  FreeOnTerminate:=true;
end;

Destructor TOBID_Thr.Destroy;
begin
  ObidThread := nil;
  Try
    if FPortHandle > 0 then
    begin
      FERWA_DeleteReader(FReader);
      FECOM_ClosePort(FPortHandle);
    end;
  except
  end;
  inherited Destroy;
end;

Procedure TOBID_Thr.Execute;
var
  I: Integer;
begin
  I := 0;
  While not Terminated do
  begin
    try
      If ReadTag then
      begin
        if FLastKey = -1 then
        begin
          FLastKey := TagStatus.Key;
          Synchronize(CallCallBack);
        end;
      end
      else
        FLastKey := -1;
    except
      inc(I);
      if I > 10 then
      begin
        I := 0;
        Synchronize(Debug)
      end;
    end;

    Sleep(FDelay);
  end;
end;

procedure TOBID_Thr.Debug;
begin
  MessageDLG
    (C_OBITNOWORK, mtWarning, [mbok], 0);
  Terminate;
end;

procedure TOBID_Thr.CallCallBack;
begin
  FCallBackFunc(TagStatus);
end;

Function TOBID_Thr.ReadTag: Boolean;
var
  iDataType: Integer;
  I: Integer;
  d: Double;
begin
  PollBuffer.cPollAction := #0#2;
  PollBuffer.cTrAdr := #0#2;
  I := FERWA_0x01_MultiJobPollAndState(FReader, 0, PollBuffer.cPollAction,
    PollBuffer.cTrAdr, PollBuffer.cSendPollData, PollBuffer.cPollValid,
    PollBuffer.cRecPollData, 0);
  TagStatus.Valid := I = 0;
  Result := TagStatus.Valid;
  if TagStatus.Valid then
  begin
    TagStatus.Key := 0;
    d := 1;
    For I := 1 to 5 do
    begin
      TagStatus.Key := TagStatus.Key + Ord(PollBuffer.cRecPollData[6 - I]) * d;
      d := d * 256;
    end;
    PollBuffer.cTrAdr := #0#0;
    PollBuffer.cPollAction := #0#2;
    I := FERWA_0x03_AdvMultiJobPollAndState(FReader, 0, PollBuffer.cPollAction,
      PollBuffer.cTrAdr, PollBuffer.cSendPollData, PollBuffer.cPollValid,
      PollBuffer.cRecPollData, 0);
    TagStatus.Valid := I = 0;
    Result := TagStatus.Valid;
    TagStatus.Schrank := Ord(PollBuffer.cRecPollData[2]) * 256 +
      Ord(PollBuffer.cRecPollData[3]);
    TagStatus.Locked := PollBuffer.cRecPollData[5] = #3;
    TagStatus.Batterie := Integer(Ord(PollBuffer.cRecPollData[6]));
    FERWA_0x75_SetOutput(FReader, 0, $10, $10, $2, $0); // BEEP
  end;
end;

end.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz