[ _Pera_Detlic_ @ 16.06.2020. 12:34 ] @
Pozdrav svima, 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; Hvala unapred svima |