Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Smartcard auslesen, Kommandos senden (https://www.delphipraxis.net/164316-smartcard-auslesen-kommandos-senden.html)

newuser01 8. Nov 2011 07:35

Smartcard auslesen, Kommandos senden
 
Hallo,

ich möchte ein kleines Tool schreiben, um eine Smartcard auszulesen. Es solln also einfach nur Kommandos zur Karte gesendet werden und dann wird das "Answer" der Karte ausgewertet. Die Kommandos hab ich und wie ich die Antworten der Karte auswerte weis ich auch. Mir fehlen aber infos wie ich das in Delphi realisieren könnte. Vielleicht gibt es ja Free Komponenten die auf den (Comport, Cardreader) zugreifen, sich also verbinden können und dann sowas wie SerialPort1.Write(kommando) oder der gleichen machen.

Ich will also nicht direkt auf die Karte schreiben sondern nur Kommandos senden und das Answer anzeigen lassen, mehr nicht.

Vielleicht könnt Ihr ja weiterhelfen.

DeddyH 8. Nov 2011 07:49

AW: Smartcard auslesen, Kommandos senden
 
Schau mal bei TComPort oder ASYNC PRO.

mquadrat 8. Nov 2011 11:07

AW: Smartcard auslesen, Kommandos senden
 
Google sagt:

http://www.vclcomponents.com/Delphi/...nent-info.html

newuser01 8. Nov 2011 16:24

AW: Smartcard auslesen, Kommandos senden
 
Ok thx, also ich versuch mich dann mal an die Kompo "TComPort" und stoß schon auf das erste Problem :-D Naja bin halt Hobby Programmierer und lang lang ist her, wo ich mal was gemacht habe :-D

Also die Eigenschaften von ComPort bei BaudRate im Objektinpektor sind mit (br9600, br115200) usw. angegeben. Wenn ich jetzt also versuche mit:

Code:
ComPort.BaudRate := 'br'+combo_baudrate.Text;
zu übergeben, kommt die Meldung "Inkompatible Typen: TBaudRate und TCaption"

Kann ich da irgendwie Konvertieren? Auch wenn ich direkt die BaudRate setzen will mit:

Code:
ComPort.BaudRate := br9600;
kommt die Meldung, "Undefinierter Bezeichner br9600"

DeddyH 8. Nov 2011 16:28

AW: Smartcard auslesen, Kommandos senden
 
Es ist zwar eine blöde Frage, aber die Unit CPort ist eingebunden? Eigentlich muss sie das ja sein, sonst könntest Du auf TComPort ja auch nicht zugreifen.

newuser01 8. Nov 2011 16:43

AW: Smartcard auslesen, Kommandos senden
 
Ich habe gerade herrausgefunden das man mit

Code:
ComPort.ShowSetupDialog
einen Setup Dialog aufruft, wo alle Einstellungen gesetzt werden können, nur möchte ich das so nicht sondern selbst eine Settings Form machen wo ich dann die Settings in einer Ini speicher. Das hab ich ja schon alles fertig und die Werte werden ja dann zb. aus der INI wie oben zu sehen in "combo_baudrate" geladen, müssen halt nur noch übergeben werden. Aber scheinbar kann man nur über diesen "ShowSetupDialog" Einstellungen tätigen.

mquadrat 8. Nov 2011 16:46

AW: Smartcard auslesen, Kommandos senden
 
Alles was du im Objektinspektor setzen kannst, kannst du auch im Code setzen

DeddyH 8. Nov 2011 16:46

AW: Smartcard auslesen, Kommandos senden
 
Das kann aber nicht sein.
Zitat:

Delphi-Quellcode:
property BaudRate: TBaudRate read FBaudRate write SetBaudRate;

Das ist eine ganz normale Property mit Setter, der auch nichts wirklich Außergewöhnliches tut. Der Fehler muss woanders liegen.

newuser01 8. Nov 2011 16:49

AW: Smartcard auslesen, Kommandos senden
 
Code:
ComPort.Port := 'COM1';
kann ich setzen aber die anderen Sachen nicht oder ich mach fehler dabei

DeddyH 8. Nov 2011 16:54

AW: Smartcard auslesen, Kommandos senden
 
Anscheinend Letzteres, bei mir klappt das (getestet unter Delphi 7 Pro) ohne Probleme.

[edit] Hier meine komplette Unit (ich habe die Komponente nicht installiert, sondern erzeuge sie dynamisch):
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, CPort;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FComPort: TComPort;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FComPort := TComPort.Create(self);
  FComPort.BaudRate := br9600;
  FComPort.Port := 'COM1';
end;

end.
Ich bekomme lediglich eine Warnung, dass Win32Check plattformspezifisch ist, ansonsten lässt sich das Programm ohne Weiteres starten. [/edit]

newuser01 8. Nov 2011 16:55

AW: Smartcard auslesen, Kommandos senden
 
wie setz ich denn die BaudRate richtig?

DeddyH 8. Nov 2011 17:01

AW: Smartcard auslesen, Kommandos senden
 
Schau noch einmal mein letztes Edit an. Ich weiß nicht, was Du anders machst, dass es bei Dir nicht gehen will.

newuser01 8. Nov 2011 17:04

AW: Smartcard auslesen, Kommandos senden
 
Ok hattest Recht, ich hab den Wald lauter Bäume nicht gesehen lol

CPort unter uses vergessen einzubinden, ich TROTTEL

newuser01 8. Nov 2011 17:06

AW: Smartcard auslesen, Kommandos senden
 
Aber kann man nun sowas wie:

Zitat:


'br'+Combo.Baudrate.Text

Konvertieren zu TBaudRate ?


DeddyH 8. Nov 2011 17:10

AW: Smartcard auslesen, Kommandos senden
 
Nicht ohne Weiteres, Du müsstest Dir schon eine Funktion dazu schreiben.

newuser01 8. Nov 2011 17:17

AW: Smartcard auslesen, Kommandos senden
 
hmmm ok dann mach ich das mit Abfragen, nicht so schlimm

Bummi 8. Nov 2011 18:51

AW: Smartcard auslesen, Kommandos senden
 
ist doch alles in CPort drin
Delphi-Quellcode:
function StrToBaudRate(Str: string): TBaudRate;
function StrToStopBits(Str: string): TStopBits;
function StrToDataBits(Str: string): TDataBits;
function StrToParity(Str: string): TParityBits;
function StrToFlowControl(Str: string): TFlowControl;
function BaudRateToStr(BaudRate: TBaudRate): string;
function BaudRateToInt(BaudRate: TBaudRate): Integer;
function StopBitsToStr(StopBits: TStopBits): string;
function DataBitsToStr(DataBits: TDataBits): string;
function ParityToStr(Parity: TParityBits): string;
function FlowControlToStr(FlowControl: TFlowControl): string;

newuser01 8. Nov 2011 18:56

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von Bummi (Beitrag 1135126)
ist doch alles in CPort drin
Delphi-Quellcode:
function StrToBaudRate(Str: string): TBaudRate;
function StrToStopBits(Str: string): TStopBits;
function StrToDataBits(Str: string): TDataBits;
function StrToParity(Str: string): TParityBits;
function StrToFlowControl(Str: string): TFlowControl;
function BaudRateToStr(BaudRate: TBaudRate): string;
function BaudRateToInt(BaudRate: TBaudRate): Integer;
function StopBitsToStr(StopBits: TStopBits): string;
function DataBitsToStr(DataBits: TDataBits): string;
function ParityToStr(Parity: TParityBits): string;
function FlowControlToStr(FlowControl: TFlowControl): string;


ok danke

muss ich das dann mit dem zusatz "br" machen oder ohne also:

Code:
so?:

sBaudrate := 9600;
ComPort.BaudRate := StrToBaudRate('br'+sBaudrate);

oder so?:

Code:
sBaudrate := 9600;
ComPort.BaudRate := StrToBaudRate(sBaudrate);

newuser01 8. Nov 2011 19:44

AW: Smartcard auslesen, Kommandos senden
 
Noch eine Frage :-D

Wenn ich zb. einen Hexwert zur Karte senden will, wie mach ich das

Hexwert: 01 02 01 00 00 00 3D

Ich verusch es derzeit so:
Code:

ComPort.WriteStr('01 02 01 00 00 00 3D');

Und fürs Answer der Karte hab ich bei "RxChar" folgendes drin:

Code:
procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer);
var
sEmpfangen:String;
begin
ComPort.ReadStr(sEmpfangen, Count);
e_anwer.Text := sEmpfangen;
end;
aber es kommt nur Mist bei raus :-D


sowas: Âü~>ÂüÂüÂü


Mach ich es so:

Code:


Function StrToHex(s: String): String;
Var i: Integer;
Begin
  Result:='';
  If Length(s)>0 Then
    For i:=1 To Length(s) Do
      Result:=Result+IntToHex(Ord(s[i]),2);
End;

procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer);
var
sEmpfangen:String;
begin
ComPort.ReadStr(sEmpfangen, Count);
e_anwer.Text := StrToHex(sEmpfangen);
end;
Code:

ComPort.WriteStr(char(01)+char(02)+char(01)+char(00)+char(00)+char(00)+char(3D));
meckert er "Bezeichner D gefunden"

totti14 8. Nov 2011 21:23

AW: Smartcard auslesen, Kommandos senden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo newuser01,
schaul dir mal den Source im BrainTool an.

Macht das was Du brauchst.

Gruß
totti14

Bummi 8. Nov 2011 21:30

AW: Smartcard auslesen, Kommandos senden
 
Delphi-Quellcode:
ComPort.WriteStr(char($01)+char($02)+char($01)+char($00)+char(00)+char($00)+char($3D));

// oder wenn es eh fix ist

ComPort.WriteStr(#01#02#01#00#00#00#$3D);
Beim Lesen solltest Du immer im Hinterkopf haben dass die Daten in Portionen kommen können bis sie komplett sind, also Puffern und den Puffer auswerten

Delphi-Quellcode:
procedure TwasAuchImmer.Comport1RxChar(Sender: TObject; Count: Integer);
var
  s:AnsiString;
begin
    BaseSerial1.ReadStr(s,Count);
    FInBuffer := FInBuffer + s; // FPuffer ist hier eine Klassenvariable
    InterpretInbuffer;         // Eine Prozedur die den Puffer auswertet, komplette Nachrichten extrahiert, aus dem Puffer entfernt und verarbeitet
end;
Das was bei Dir ankommt sollte wenn Du wirklich Delphi7 verwendest, also kein Unicodeproblem haben kannst, an falschen Einstellungen für Baudrate, Stopbit, Parity oder ähnlichem liegen ...
BZW: was soll da rauskommen, wenn Du wieder HexCodes erwartest musst Du diese aus den Bytes extrahieren.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Const
 Test='Âü~>ÂüÂüÂü';
var
 s:AnsiString;
 HexOut:String;
 i:Integer;
begin
 s := Test;
 for I := 1 to Length(test) do HexOut := HexOut +'$' +IntToHex(Byte(s[i]),2);
 Showmessage(HexOut);
end;

Sir Rufo 8. Nov 2011 22:57

AW: Smartcard auslesen, Kommandos senden
 
SmartCard ... SmartCardLeser ... gibt es da nicht eine API?

CT-API = Card Terminal API (neueste Version von 2001)
Und Microsoft hat da auch eine SmartCard API

Bevor ich da mit den ComPorts kämpfen würde, würde ich eher diese APIs bemühen.

newuser01 9. Nov 2011 07:44

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von totti14 (Beitrag 1135151)
Hallo newuser01,
schaul dir mal den Source im BrainTool an.

Macht das was Du brauchst.

Gruß
totti14


@totti14 Danke, für den Source

newuser01 9. Nov 2011 08:20

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von Bummi (Beitrag 1135152)
Delphi-Quellcode:
ComPort.WriteStr(char($01)+char($02)+char($01)+char($00)+char(00)+char($00)+char($3D));

// oder wenn es eh fix ist

ComPort.WriteStr(#01#02#01#00#00#00#$3D);
Beim Lesen solltest Du immer im Hinterkopf haben dass die Daten in Portionen kommen können bis sie komplett sind, also Puffern und den Puffer auswerten

Delphi-Quellcode:
procedure TwasAuchImmer.Comport1RxChar(Sender: TObject; Count: Integer);
var
  s:AnsiString;
begin
    BaseSerial1.ReadStr(s,Count);
    FInBuffer := FInBuffer + s; // FPuffer ist hier eine Klassenvariable
    InterpretInbuffer;         // Eine Prozedur die den Puffer auswertet, komplette Nachrichten extrahiert, aus dem Puffer entfernt und verarbeitet
end;
Das was bei Dir ankommt sollte wenn Du wirklich Delphi7 verwendest, also kein Unicodeproblem haben kannst, an falschen Einstellungen für Baudrate, Stopbit, Parity oder ähnlichem liegen ...
BZW: was soll da rauskommen, wenn Du wieder HexCodes erwartest musst Du diese aus den Bytes extrahieren.
]


Also ich versuch gerade den festen Wert zu senden, so wie du es beschrieben hast:

Delphi-Quellcode:
procedure Tfrm_main.btn_readcardClick(Sender: TObject);
begin
ComPort.WriteStr(#01#02#01#00#00#00#$3D);
end;
Delphi-Quellcode:
procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer);
var
sEmpfangen:AnsiString;
begin
ComPort.ReadStr(sEmpfangen,Count);
e_answer.Text := StrToHex(sEmpfangen);
end;
Als Antwort kommt aber wieder das selber zurück, was ich gesendet habe.

0102010000003D

Die Karte läuft ja mit 6 MHz

Kann es sein, das die Mhz noch irgendwo in "ComPort.???" eingestellt werden müssen? oder reicht es wenn ich bei meinem Cas3 auf "POENIX 6.00 MHz" eingestellt habe ? Oder ich hab die ganze Sache mit dem Answer noch nicht verstanden. Wie würde denn zb. ein Reset aussehen um den ATR in "e_answer.Text" zu bekommen? Aus den Sourcen vom TBrain Tool werd ich nicht ganz schlau, sind aber sicher auf die Komponente "ComPort" zu portieren oder?

hier mal ein Auszug aus den Sourcen (Brain.pas) (Einstellungen MHz)


Delphi-Quellcode:

procedure TBrain.InitComPortParams(const Mode: TBrainResetModes);
begin
  Port.Handshaking := hsCustom;

  Case FFrequency Of
    Frequency357MHz:
    begin
      Port.PortCustom.dcb.XonLim := 1024;
      Port.PortCustom.dcb.XoffLim := 1024;

      Port.PortCustom.TimeOuts.ReadIntervalTimeout        := DWORD(-1);
      Port.PortCustom.TimeOuts.ReadTotalTimeoutMultiplier := DWORD(-1);
      Port.PortCustom.TimeOuts.ReadTotalTimeoutConstant   := 500;
      Port.PortCustom.TimeOuts.WriteTotalTimeoutMultiplier := DWORD(-1);
      Port.PortCustom.TimeOuts.WriteTotalTimeoutConstant  := 500;

      Port.PortCustom.InSize := 4096;
      Port.PortCustom.OutSize := 2048;
    end;
    Frequency6MHz:
    begin
      Port.PortCustom.dcb.XonLim := 2048;
      Port.PortCustom.dcb.XoffLim := 512;

      Port.PortCustom.TimeOuts.ReadIntervalTimeout        := DWORD(-1);
      Port.PortCustom.TimeOuts.ReadTotalTimeoutMultiplier := 0;
      Port.PortCustom.TimeOuts.ReadTotalTimeoutConstant   := 0;
      Port.PortCustom.TimeOuts.WriteTotalTimeoutMultiplier := 0;
      Port.PortCustom.TimeOuts.WriteTotalTimeoutConstant  := 5000;

      Port.PortCustom.InSize := 10000;
      Port.PortCustom.OutSize := 10000;
    end;
  end;

Und hier die Reset Funktion sowie GetCardATR

Delphi-Quellcode:
function TBrain.Reset(const Mode: TBrainResetModes): TAnswerToReset;
var
  reset1: TAnswerToReset;
  buffer1: array Of Byte;
begin
  Try
    SetBasicPortParams(Mode);
    Port.SetState;

    Port.DtrEnable := true;
    Port.RtsEnable := false;
         
    While (Port.BytesToRead > 0) do
      Port.ReadByte;

    Port.RtsEnable := True;
    Port.RtsEnable := False;

    If (Mode = ResetModeCerebro) Then
      Port.WriteByte($99); // Port.BaseStream.WriteByte($99)

    Delay(400);
    If (Mode = ResetModeCerebro) Then
      Port.ReadByte;

    If (Port.BytesToRead > 0) Then
    begin
      SetLength(buffer1, Port.BytesToRead);
      Port.Read(buffer1[0], 0, Length(buffer1));

      result := TAnswerToReset.Create(buffer1);
      Exit;
    end;

    reset1 := TAnswerToReset.Create;
  except
    reset1 := TAnswerToReset.Create;
  End;
 
  result := reset1;
end;

function TBrain.GetCardATR(Mode: TBrainResetModes): TAnswerToReset;
begin
  result := nil;

  //Port.PortCustom.Mask := EV_RXCHAR or EV_RXFLAG or EV_CTS or EV_DSR or EV_RLSD or EV_BREAK or EV_ERR or EV_RING;
  If OpenComPort(Mode) then
  begin
    result := Reset(Mode);

    If Mode <> ResetModeCerebro then
    begin
      result.CardLang  := GetIrdetoLanguage;
      result.CardType  := GetIrdetoType;
      result.CardSerial := GetIrdetoSerial;
      result.CardHexSerial := GetIrdetoHexSerial;
    end;

    CloseComPort;
  end;
  Port.PortCustom.Mask := 0;
 
  If not Assigned(result) then
    result := TAnswerToReset.Create;
end;

Bummi 9. Nov 2011 08:28

AW: Smartcard auslesen, Kommandos senden
 
Du könntest ja alles direkt an der Komponente einstellen, den "NON-VCL-Overhead" brauchst Du ja nicht.
Im Moment, es kommt etwas definiertes zurück, würde ich vermuten dass Du Dir das Protokoll erarbeiten musst ...

newuser01 9. Nov 2011 09:28

AW: Smartcard auslesen, Kommandos senden
 
Naja eingestellt ist alles richtig eingestellt so wie in der Brain.pas für diese karte auch

Brain.pas
Delphi-Quellcode:
    ResetModeNormal, ResetModeCerebro:
    begin
      Port.BaudRate := 9600;
      Port.Parity := EvenParity;
      Port.DataBits := 8;
      Port.StopBits := OneStopBit;
    end;
  end;
end;
meine Einstellungen:

Delphi-Quellcode:
comport.Port := combo_port.Text;
ComPort.BaudRate := br9600;
ComPort.DataBits := dbEight;
ComPort.Parity.Bits := prEven;
ComPort.StopBits := sbOneStopBit;

Delphi-Quellcode:
    Frequency6MHz:
    begin
      Port.PortCustom.dcb.XonLim := 2048;
      Port.PortCustom.dcb.XoffLim := 512;
diese einstellungen finde ich nicht in ComPort

Bummi 9. Nov 2011 11:50

AW: Smartcard auslesen, Kommandos senden
 
die sind in der Komponente enthalten und werden über Buffer.Inputsize gesetzt
Delphi-Quellcode:
    DCB.DCBlength := SizeOf(TDCB);
    DCB.XonLim := FBuffer.InputSize div 4;
    DCB.XoffLim := DCB.XonLim;
    DCB.EvtChar := TCPortChar(FEventChar);
Smartcard ist ein derart butterweicher Begriff, da Du nicht erwarten kannst dass ein Programm das bei irgendjemandem mit irgendeiner Karte bei Dir mit einer anderen Karte etwas sinnvolles produziert.
Was sollte den beim Senden des von Dir genanntes Strings von der Karte zurückkommen?

newuser01 9. Nov 2011 12:30

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von Bummi (Beitrag 1135253)
Was sollte den beim Senden des von Dir genanntes Strings von der Karte zurückkommen?


Hex Serial abfragen
01 02 01 00 00 00 <3D>
Antwort der Karte
01 02 00 00 01 00 00 10 00 17 00 00 02 00 17 00 00 03 04 80 xx xx xx 1A <68>


Im übrigen handelt es sich wie bei dem BrainTool um die selbe Karte die ausgelesen werden soll, eine alte S02 Karte :-D

@Bummi mir würde zum Anfang das anzeigen des ATR schon mal reichen. Um zu sehen obs überhaupt richtig passt.

newuser01 9. Nov 2011 12:38

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von DeddyH (Beitrag 1134929)
Schau mal bei TComPort oder ASYNC PRO.

Ich habe mal noch die Komponente "ASYNC PRO" installiert, was ist an dieser anders (API) ?

DeddyH 9. Nov 2011 12:57

AW: Smartcard auslesen, Kommandos senden
 
Ganz ehrlich? Ich habe nicht die leiseste Ahnung. Ich hatte nur die Frage nach kostenlosen Komponenten für die serielle Schnittstelle gelesen und die ersten beiden verlinkt, die mir einfielen. Das heißt aber nicht, dass ich mich je damit beschäftigt hätte.

Micha88 9. Nov 2011 13:08

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von newuser01 (Beitrag 1135088)
Also die Eigenschaften von ComPort bei BaudRate im Objektinpektor sind mit (br9600, br115200) usw. angegeben. Wenn ich jetzt also versuche mit:

Code:
ComPort.BaudRate := 'br'+combo_baudrate.Text;
zu übergeben, kommt die Meldung "Inkompatible Typen: TBaudRate und TCaption"

Kann ich da irgendwie Konvertieren? Auch wenn ich direkt die BaudRate setzen will mit:

Code:
ComPort.BaudRate := br9600;
kommt die Meldung, "Undefinierter Bezeichner br9600"



Wieso machst du nicht einfach:
Delphi-Quellcode:
var bRate: TBaudRate;
begin
 case combo_baudrate.ItemIndex of
  0: bRate := br9600;
  1: bRate := br115200;
  // usw.
 end;

 ComPort.BaudRate := bRate;
end;

newuser01 9. Nov 2011 13:14

AW: Smartcard auslesen, Kommandos senden
 
Gute Idee @Micha und thx für den Tipp, werd ich mal so umbasteln aber im Moment ist dies, dass kleinste Problem was ich hab ;-)

newuser01 9. Nov 2011 13:16

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von DeddyH (Beitrag 1135263)
Ganz ehrlich? Ich habe nicht die leiseste Ahnung. Ich hatte nur die Frage nach kostenlosen Komponenten für die serielle Schnittstelle gelesen und die ersten beiden verlinkt, die mir einfielen. Das heißt aber nicht, dass ich mich je damit beschäftigt hätte.

Ok , kein Problem ;-) du hast mir ja schon gut weitergeholfen. Ich sehe zumindest schon mal wenn ich was sende, das es beim CAS3 Reader ankommt (grünes Lämpchen blinkt dann kurz) Die Answers der Karte sind nicht die die ich erwarte aber das liegt bestimmt daran, dass ich das ganze Prinzip noch nicht verstanden hab und Fehler beim Senden mache wie Abfrage, Reihenfolge wie auch immer. Wenn ich wenigstens schon wüsste, wie ich mit dieser Komponente einen Kartenreset machen kann und dann den ATR der Karte bekomme. Damit wüsste ich zumindest, das dann die Einstellungen für die Karte richtig wären.

Bummi 9. Nov 2011 13:32

AW: Smartcard auslesen, Kommandos senden
 
Wenn der Braincode für Deine Karte passt wäre IMHO $99 ein Reset
#$01#$02#$00#$00#$00#$00#$3C die Seriennummernabfrage
#$01#$02#$02#$00#$00#$00#$3E der Typ
und das was Du versucht hast ist die Sprache

newuser01 9. Nov 2011 13:33

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von Bummi (Beitrag 1135274)
Wenn der Braincode für Deine Karte passt wäre IMHO $99 ein Reset
#$01#$02#$00#$00#$00#$00#$3C die Seriennummernabfrage
#$01#$02#$02#$00#$00#$00#$3E der Typ
und das was Du versucht hast die Sprache


was ich versuche hast die Sprache? was meinst du hehe

DeddyH 9. Nov 2011 13:39

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von Micha88 (Beitrag 1135265)
Wieso machst du nicht einfach:
Delphi-Quellcode:
var bRate: TBaudRate;
begin
 case combo_baudrate.ItemIndex of
  0: bRate := br9600;
  1: bRate := br115200;
  // usw.
 end;

 ComPort.BaudRate := bRate;
end;

Dann muss aber auch sichergestellt sein, dass sich erstens die Items immer in der richtigen Reihenfolge befinden und sich zweitens dies niemals ändern wird. Ansonsten ist diese Funktion bei Änderungen an der ComboBox mit anzupassen. Also alles in allem ein potentielle Fehlerquelle.

Bummi 9. Nov 2011 13:43

AW: Smartcard auslesen, Kommandos senden
 
Ich hatte mich verguckt :oops:

Hex Serial abfragen
#01#02#01#00#00#00#$3D

sieht ähnlich aus wie

Brainauszug
Delphi-Quellcode:
function TBrain.GetIrdetoLanguage(): String;
const
  buffer0: TIrdetoCommandBuffer = ( Data: ($01, $02, $02, $03, $00, $00, $3D) );


Den Code den Du versuchst habe ich nicht gefunden ....

Micha88 9. Nov 2011 13:43

AW: Smartcard auslesen, Kommandos senden
 
Ach so.
Ich dachte die Werte wären immer Fix und an der selben Stelle.

DeddyH 9. Nov 2011 13:45

AW: Smartcard auslesen, Kommandos senden
 
Das müssen sie bei der Vorgehensweise sein. Nur wenn man später mal was ändert (umsortiert z.B.), dann kann schnell übersehen werden, dass die Funktion entsprechend anzupassen ist. Daher mein Einwand.

newuser01 9. Nov 2011 14:16

AW: Smartcard auslesen, Kommandos senden
 
Zitat:

Zitat von Bummi (Beitrag 1135279)
Ich hatte mich verguckt :oops:

Hex Serial abfragen
#01#02#01#00#00#00#$3D

sieht ähnlich aus wie

Brainauszug
Delphi-Quellcode:
function TBrain.GetIrdetoLanguage(): String;
const
  buffer0: TIrdetoCommandBuffer = ( Data: ($01, $02, $02, $03, $00, $00, $3D) );


Den Code den Du versuchst habe ich nicht gefunden ....


@brummi könntest du mir bitte anhand der von mir verwendeten Komponente kurz und verständlich zeigen, wie ich den ATR auslese?


Also meine Einstellungen sind jetzt:

Delphi-Quellcode:
ComPort.BaudRate := br9600;
ComPort.DataBits := dbEight;
ComPort.Parity.Bits := prEven;
ComPort.StopBits := sbOneStopBit;
Das dürfte also passen für die Karte. Die Antwort der Karte soll dazu einfach mal in ein answer.text Feld


WriteByte($99) gibt es ja nicht, ich hab ja nur ComPort.WriteStr und was genau in

ComPortRxChar rein muss, weis ich auch nicht
Delphi-Quellcode:
procedure Tfrm_main.ComPortRxChar(Sender: TObject; Count: Integer);
var
sEmpfangen:AnsiString;
begin

ComPort.ReadStr(sEmpfangen,Count);
answer.Text := StrToHex(sEmpfangen);
end;
oder muss es gar in ComPortRxBuf ?

Das ganze bringt mir nichts, wenn ich nicht von Anfang an Schritt für Schritt aufbaue, Code kopieren ist einfach aber verstehen will ich Ihn auch. Und die genauen Abläufe ebenso.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.
Seite 1 von 2  1 2      

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