Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

FP550+ citanje podataka sa porta

[es] :: Pascal / Delphi / Kylix :: FP550+ citanje podataka sa porta

[ Pregleda: 1164 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

_Pera_Detlic_
Bez radnog mesta
BGD

Član broj: 323854
Poruke: 5
87.116.177.*



Profil

icon FP550+ citanje podataka sa porta16.06.2020. u 12:34 - pre 46 meseci
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


 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: FP550+ citanje podataka sa porta16.06.2020. u 13:36 - pre 46 meseci
Nisam video tu razliku u paketima ako ide preko USBa, jedina primetna razlika je da se posle nekog vremena neaktivnosti izgubi veza sa stampacem. Glavna greska koju vidim je da koristis ReadStr sto nikako nije dobro za binarni protokol, koristi Read i citaj bajt po bajt dok ne dodje do kraja, npr:
if ComPort.Read(FComBuffer, 1) = 1 then
ako si dobio ASCII_SOH, procitaj paket do kraja,
ako si dobio ASCII_SYN, vrti se u petlji i citaj po jedan bajt dok ne dodje ASCII_SOH
ako si dobio ASCII_NAK, nesto nije u redu

Nemoj da koristis timer za citanje ili bilo kakav rad sa uredjajem, najbolje da imas dedicated worker thread za tu svrhu.
 
Odgovor na temu

_Pera_Detlic_
Bez radnog mesta
BGD

Član broj: 323854
Poruke: 5
87.116.177.*



Profil

icon Re: FP550+ citanje podataka sa porta16.06.2020. u 15:40 - pre 46 meseci
@savkicu,
hvala na savetima, najgore je kada moras da petljas po tudjem kodu treba pohvatati sve te tajmere a ima ih nekoliko u programu.

Da pokusam da prepravim sve kako kazes pa se javljam sa problemima ili bez :)
 
Odgovor na temu

_Pera_Detlic_
Bez radnog mesta
BGD

Član broj: 323854
Poruke: 5
87.116.179.*



Profil

icon Re: FP550+ citanje podataka sa porta13.07.2020. u 21:19 - pre 45 meseci
Da se zahvalim Savkicu na savetima, sve je reseno.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: FP550+ citanje podataka sa porta

[ Pregleda: 1164 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.