[delphi] Procedurka wysyłania instrukcji do ...

0

witam all

zdobyłem mały program do połaczenia z kartą przez programator phoenix
jak na razie jest odczyt ATR karty. brakuje jedynie procedurki wysyłania hexów do karty i odczytu zamieszczam KAWAŁEK PROGRAMU i procedurke odczytu atr może ktoś wie jak zrobić procedure wysyłania lub odczytu

za POMOC BIG THX

var
bufor : array[1..400] of byte; { bufor programatora }
s: string;
i :integer;
ready: integer;
plikedit: string;

const
Data = $378; // domyślny adres portu
Status = Data + 1;
Control = Data + 2;

procedure TForm1.FormCreate(Sender: TObject);
begin
ready:=0;
end;

function hex2long(s : string) : longint;
var
r : longint;
i : word;
c : char;
begin
r:=0;
for i:=1 to length(s) do begin
c:=upcase(s[i]);
r:=r shl 4;
if c > '9' then r:=r or (ord(c)-55)
else r:=r or (ord(c)-48)
end;
hex2long:=r;
end;

procedure TForm1.Button5Click(Sender: TObject);

var x : integer;
begin

if comport.connected = true
then begin
ComPort.SetRTs(True); // set RTS to high
ComPort.SetRTS(False); // lower RTS signal
x := 1; memo1.text :='';
ComPort.Read(bufor,16);
repeat

memo1.text  := memo1.text + INTTOHEX(bufor[x],2)+' ';
 x := x +1

until x = 17;
sleep(250);
bufreset;
end;

0

Spróbuj komponentu comport
http://sourceforge.net/projects/comport/

Kilka przykładów:

procedure TForm1.ButtonResetClick(Sender: TObject);

var
i : integer;
ss : string;
rx:array[1..255] of byte;
begin
if ComPort1.Connected  then begin
   ComPort1.SetRTS(True); // set RTS to high
   ComPort1.SetRTS(False); // lower RTS signal

     sleep (250); //czekaj na atr
     count := 16; // dlugosc atr
     comport1.Read(rx,count);
     for i:=1 to count do
     begin
        ss:=ss+inttohex(rx[i],2)+' ';
     end;
 Memo1.Lines.add('atr ->' + ss);
 end;
end;

To, co najwazniejsze, musisz wiedzieć, że gdy wysyłasz dane , to one wracają - echo
Program musi te wracające dane odpowiednio pominąć.

Przykładowy kodzik:

Function Tform1.DoKarty (ins: string; dane : string):string;
var
len,i,j : integer;
ss,ack,status : string;
rx:array[1..255] of byte;
sx:array[1..255] of byte;

begin
if ComPort1.Connected then begin

len := ((Length(ins)DIV 2)); //obliczam dlugosc
for i:=0 to len-1 do sx[i+1]:=strtoint('$'+copy(ins,i*2+1,2));
form1.comport1.Write(sx,Len); //wysylam instrukcje

sleep(len + 15);//czekaj na echo
form1.ComPort1.Read(rx,Len);//odczytaj echo
form1.ComPort1.Read(rx,1);//odczytaj ack
    ack := inttohex(rx[1],2);
    form1.memo1.lines.add ('Ack ->' + Ack);
    Eack.text := Ack;

len := ((Length(Dane)DIV 2)); //obliczam dlugosc
for i:=0 to len-1 do sx[i+1]:=strtoint('$'+copy(Dane,i*2+1,2));
form1.comport1.Write(sx,Len); //wysylam instrukcje

sleep(len +15);//czekaj na echo i status
form1.ComPort1.Read(rx,Len);//odczytaj echo

sleep(len*2);//<--------- czekaj na status az karta przeliczy instrukcje
form1.ComPort1.Read(rx,2);//odczytaj status
    status := inttohex(rx[1],2) + inttohex(rx[2],2);
    Estatus.text := Status;
    Result :=status ;
 End;
End;
.

Oczywiście wszytko zależy z jaką kartą się komunikujesz.
Te przykłady , dotyczą crypt@works. inne systemy działają podobnie.
Jakieś pytania, pisz. Chętnie pomogę.

0

wielkie dzieki własnie o to mi chodziło lecz u mnie to nieśmiga na czerwono jest

len := ((Length(ins)div 2)); //obliczam dlugosc

za pomoc wielkie dzieki może napisz do mnie na gg 5221747 albo coś to pogadamy :)

jesli pytasz o jakie karty chodzi to o seca2 :) nasze polskie

dzieki jestem na niewidocznym jak co czekam

pozdr s-s

0

GG nie używam.

Różne przykłady komunikacji z kartą można znaleźć w necie.
Np.
http://joshyfun.sytes.net/PMCAM2_2.51_Delphi_Source_Code.zip

Pozdrawiam i sukcesów życzę.

0

wielkie dzięki

a może masz coś do systemu seca2 albo coś

bo bardzo tego potrzebuje i jeszcze raz dzięki za pomoc

a może masz jakiś inyy komunikator do rozmów podaj

dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1