potrebna mi je pomoc a radi se o drajveru za fisklani stampac Intraster FP550+ (isti protokol ka za Galeb FP550 ili GP550).
Naime imam drajver koji je neko drugi pravio i sve radi kako treba kada je povezan direktno na RS232. Medjutim problem se javlja kada se stampac zakaci preko USB adaptera (Digitus).
Sada to treba da se ispravi pa niko od nas ne moze da se snadje.
Radi se o tome da adapter koliko god dobar bio malo drugacije vraca pakete kada je preko USB adaptera.
U uputstvu pise sledece:
Stampac odgovara najkasnije do 60ms, spakovanom porukom ili nespakovanom (1 bajt). Nepakovane poruke su od 1. bajta i bivaju:
NAK 15H - Slave šalje ovaj kod kada konstatuje neku grešku u kontrolnom iznosu ili formatu dobijene poruke.
SYN 16H - Slave šalje ovaj kod kada je zadata komanda za ĉije je izvršenje potrebno više vremena. SYN se šalje svakih 60ms dok pakovana poruka ne bude spremna za odgovor.
Pakovana poruka sa stampaca izgleda: <01><LEN><SEQ><CMD><DATA><04><STATUS><05><BCC><03>
Problem je taj da podaci stizu iz nekoliko puta medjutim desava se da kao prvi bajt stigne ili Preamble <1> ili neke cudne kvacice.
<01> Preamble
duzina: 1 bajt
vrednost: 01H
U fiskalnom štampaču sve komande kreću sa ovim bajtom, osim ako je printer zauzet izvršavanjem prethodne operacije i ne stigne da završi operaciju za 60ms.
Komponentu koje je prethodnik koristio je TComPort
Procedura za citanje podataka sa porta izgleda ovako, pa ako moze pomoc da ispravimo proceduru da radi kako treba:
Code:
procedure TfFisMain.Comm1RxChar(Sender: TObject; Count: Integer);
var
Str, s,d, hRes: AnsiString;
i,l: Integer;
begin
sb.SimpleText:='Receiving Data: '+TimeToStr(Now);
Application.ProcessMessages;
Received:=True;
if Comm1.ReadStr(str, Count)>=0 then begin
if PartialReceive then
s:=sReceived+str
else
s:=str;
if s[Length(s)]<>Chr(3) then begin
Received:=False;
PartialReceive:=True
end
else
PartialReceive:=False;
if Length(s)=1 then begin
case Ord(s[1]) of
$15 : sb.SimpleText:='Error (NAK15): '+TimeToStr(Now);
$16 : begin
s:='Wait';
Timer1.Enabled:=False;
Timer1.Enabled:=True;
Received:=False;
Exit;
end;
else
sb.SimpleText:='Unknown ERROR - Nepoznata greška: ' + TimeToStr(Now);
end;
Exit;
end;
d:='';
i:=1;
while s[i]=Chr($16) do Inc(i);
while i<=Length(s) do begin d:=d+s[i]; Inc(i); end;
s:=D;
if Length(s)=0 then begin
Timer1.Enabled:=False;
Timer1.Enabled:=True;
Received:=False;
Exit;
end;
Timer1.Enabled:=False;
end
else
s:='Error';
sReceived:=s;
if Received and not PartialReceive then CheckStatus(False);
Sb.SimpleText := '';
Application.ProcessMessages;
end;
procedure TfFisMain.Comm1RxChar(Sender: TObject; Count: Integer);
var
Str, s,d, hRes: AnsiString;
i,l: Integer;
begin
sb.SimpleText:='Receiving Data: '+TimeToStr(Now);
Application.ProcessMessages;
Received:=True;
if Comm1.ReadStr(str, Count)>=0 then begin
if PartialReceive then
s:=sReceived+str
else
s:=str;
if s[Length(s)]<>Chr(3) then begin
Received:=False;
PartialReceive:=True
end
else
PartialReceive:=False;
if Length(s)=1 then begin
case Ord(s[1]) of
$15 : sb.SimpleText:='Error (NAK15): '+TimeToStr(Now);
$16 : begin
s:='Wait';
Timer1.Enabled:=False;
Timer1.Enabled:=True;
Received:=False;
Exit;
end;
else
sb.SimpleText:='Unknown ERROR - Nepoznata greška: ' + TimeToStr(Now);
end;
Exit;
end;
d:='';
i:=1;
while s[i]=Chr($16) do Inc(i);
while i<=Length(s) do begin d:=d+s[i]; Inc(i); end;
s:=D;
if Length(s)=0 then begin
Timer1.Enabled:=False;
Timer1.Enabled:=True;
Received:=False;
Exit;
end;
Timer1.Enabled:=False;
end
else
s:='Error';
sReceived:=s;
if Received and not PartialReceive then CheckStatus(False);
Sb.SimpleText := '';
Application.ProcessMessages;
end;
Hvala unapred svima