Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Delphi, jak wysłać kody starujące na COM do fiskalnej?

tomek_wodzu 28 May 2009 15:38 4728 14
phoenixcontact
  • #1
    tomek_wodzu
    Level 11  
    Witam, raczkuję w Delphi i nie potrafię wysłać komend do drukarki fiskalnej. Otwarłem port COM1 i kiszka. Tyle mam i co dalej, bo nic mi nie wychodzi? Proszę w wskazówki od delphi wyjadaczy.

    procedure TForm1.Button1Click(Sender: TObject);
    var 
    hCOM:THandle;
    nrWrit:DWORD;
    nrRead:DWORD;
    Errors:DWORD;
    Dcb:TDCB;
    ComStat:TComStat;
    buf:array[0..2048] of char;
    begin
    //Otwarcie łącza COM
    hCOM:=CreateFile('COM1',GENERIC_WRITE OR GENERIC_READ,0,nil,OPEN_EXISTING,0,0);
    
    //Ustawienie parametrów transmisji
      if hCOM<>INVALID_HANDLE_VALUE then
      begin
        GetCommState(hCOM,Dcb);
        BuildCommDCB('9600,n,8,1',Dcb);
        SetCommState(hCOM,Dcb);
      end else
      begin
        ShowMessage('Błąd otwarcia portu COM ');
      end;
    
    try
    //Przygotowanie bufora
    ZeroMemory(@buf,SizeOf(buf));
    StrCopy(buf,'ESC P #n ESC \');
    
    //Zapis bufora
    
      if not WriteFile(hCOM,buf,StrLen(buf),nrwrit,nil) then
      begin
        ShowMessage('Błąd zapisu do portu COM.');
    
        //Sprawdzenie czy jest coś w buforze COM
        ClearCommError(hCOM,Errors,@ComStat);
      end else
      begin
     
     Label2.Caption:='Połączono z COM';
    
      end;
      sleep(2000);
    //Odczytanie bufora gdy są dane
      if ComStat.cbInQue>0 then
        ReadFile(hCOM,buf,ComStat.cbInQue,nrRead,nil);
        memo1.text:=buf;
      finally
        sleep(2000);
        CloseHandle(hCOM);
        label1.caption:='Rozłączono z COM';
    end;
    end; 


    Dodano po 2 [minuty]:

    Chodzi mi o to też, czy poprawnie są zapisane komendy drukarki w buforze?

    Proszę umieszczać kod w znacznikach [code] - dodałem.
    [Dr.Vee]
  • phoenixcontact
  • #2
    rys57
    Moderator
    Przeniosłem z "Drukarki..." Pozostał odnośnik. Tu chyba łatwiej znajdziesz pomoc.
  • phoenixcontact
  • #3
    Szymon Tarnowski
    Level 27  
    A dokładnie na czym polega problem?
  • #4
    tomek_wodzu
    Level 11  
    Problem mam z podaniem kodów drukarce fiskalnej posnet. Mam np. taki kod dający sygnał 'ESC P #n ESC \' który zwracać ma kod błędu i nie wiem jak mam jej to podać. Wysyłając jako string nie działa. Czy te znaki trzeba zapisać w innej formie?
  • #5
    KeinXor
    Level 24  
    Witam,
    czy koniecznie musisz sam preparować ramki do Posneta ? może wygodniej będzie wykorzystać ich bibliotekę funkcjami do sterowania drukarką, jest do pobrania z ich strony.


    ------edit-------

    Zerknąłem w Twój kod i pierwsze co żuciło mi się w oczy to
    StrCopy(buf,'ESC P #n ESC \'); 

    podajesz w parametrze string który zostaje przepisany do bufora, ok ale podajesz żywcem ESC a musisz podać kod znaku #27.
  • #6
    tomek_wodzu
    Level 11  
    OK, bibliotekę załadowałem, tylko jak mam teraz ją użyć?
  • #7
    KeinXor
    Level 24  
    Posnet z tego co kojarzę ma dwie biblioteki, jedna w formacie activex a druga "zwykła" z konwencją wywołania stdcall, w pierwszej wersji w środowisku importujesz bibliotekę, automatycznie zostaje wygenerowany unit który zawiera klasę z metodami do obsługi drukarki. Natomiast w drugim przypadku (zwykła biblioteka .dll) o ile posnet nie dołączył unitu z wywołaniem funkcji będziesz musiał je sobie sam napisać lub poczekać do poniedziałku (kiedy bede w pracy) jak nie zapomnę to zamieszczę na forum pare wywołań funkcji z ich biblioteki.
  • #10
    tomek_wodzu
    Level 11  
    Dzięki za materiał, zaraz go analizuję. Dzięki bardzo!
  • #11
    tomek_wodzu
    Level 11  
    Kurcze, troche dużo naraz funkcji jak na początkującego. Mógłbyś mi dać przykład kompletnego sygnału dla drukarki fiskalnej? Chodzi mi o wywołanie funkcji i odpalenie jej, bo masz dużo deklaracji których nie kumam i nie wiem czy mi są one potrzebne.
  • #12
    KeinXor
    Level 24  
    Nie bardzo rozumiem o co pytasz
    Quote:
    sygnału dla drukarki fiskalnej
    ...
    pierwsze co to otwierasz port, następnie wołasz funkcję jedną lub zestaw w zależności czy drukarka tego wymaga w sio ot to cała filozofia. Jak wołać te funkcją masz opisane w dokumentacji dla pliku .dll sciągnietego od producenta.
  • #13
    tomek_wodzu
    Level 11  
    Udało mi się otworzyć port. Ale czy teraz wysyłanie kolejnych sygnałów ma jakąś kolejność? Np. czy pierw trzeba sprawdzić czy ma stawki vat, bo inaczej nie ruszy? Bo próbowałem wysłać jakąś linię i nic. Chodzi mi to bym zobaczył na fiskalnej jakiś efekt. Na razie używam emulatora drukarki posnet, a nie rzeczywistej drukarki, czy to jest jakaś różnica?
  • Helpful post
    #14
    KeinXor
    Level 24  
    Nie korzystałem z emulatora wiec nie powiem Ci jak on działa, w normalne drukarce fiskalnej musisz wykonać raport dobowy, aby móc drukować paragon.
  • #15
    tomek_wodzu
    Level 11  
    Zrobiłem to biblioteką dll ze strony producenta. Nawet działa.