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;