Serieller Drucker und api



  • So, hier noch eine mit Visual Studio 2008 getestete Version, der Kürze halber als Kommandozeilenanwendung.

    Die stdafx.h

    // stdafx.h : Includedatei für Standardsystem-Includedateien
    // oder häufig verwendete projektspezifische Includedateien,
    // die nur in unregelmäßigen Abständen geändert werden.
    //
    
    #pragma once
    
    #include "targetver.h"
    
    #include <stdio.h>
    #include <tchar.h>
    
    // TODO: Hier auf zusätzliche Header, die das Programm erfordert, verweisen.
    #include <atlstr.h>
    

    und das Hauptprogramm

    // CStringTest.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    
    using namespace std;
    
    BOOL RawDataToPrinter(LPTSTR szPrinterName, LPVOID lpData, DWORD dwCount)
    {
      HANDLE     hPrinter;
      DOC_INFO_1 DocInfo;
      DWORD      dwJob;
      DWORD      dwBytesWritten;
    
      // Need a handle to the printer.
      if( ! OpenPrinter( szPrinterName, &hPrinter, NULL ) )
        return FALSE;
    
      // Fill in the structure with info about this "document."
      DocInfo.pDocName = _T("My Document");
      DocInfo.pOutputFile = NULL;
      DocInfo.pDatatype = _T("RAW");
      // Inform the spooler the document is beginning.
      if( (dwJob = StartDocPrinter( hPrinter, 1, (LPBYTE)&DocInfo )) == 0 )
      {
        ClosePrinter( hPrinter );
        return FALSE;
      }
      // Start a page.
      if( ! StartPagePrinter( hPrinter ) )
      {
        EndDocPrinter( hPrinter );
        ClosePrinter( hPrinter );
        return FALSE;
      }
      // Send the data to the printer.
      if( ! WritePrinter( hPrinter, lpData, dwCount, &dwBytesWritten ) )
      {
        EndPagePrinter( hPrinter );
        EndDocPrinter( hPrinter );
        ClosePrinter( hPrinter );
        return FALSE;
      }
      // End the page.
      if( ! EndPagePrinter( hPrinter ) )
      {
        EndDocPrinter( hPrinter );
        ClosePrinter( hPrinter );
        return FALSE;
      }
      // Inform the spooler that the document is ending.
      if( ! EndDocPrinter( hPrinter ) )
      {
        ClosePrinter( hPrinter );
        return FALSE;
      }
      // Tidy up the printer handle.
      ClosePrinter( hPrinter );
      // Check to see if correct number of bytes were written.
      if( dwBytesWritten != dwCount )
      {
        return FALSE;
      }
      return TRUE;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
      CString drucker = _T("DerDrucker");  // <=== Da kommt der Name deines Druckers rein
      CString text = _T("Hallo"); // <== Hier kommen die Druckdaten rein.
    
      CStringA ansi(text);
    
      RawDataToPrinter(drucker.GetBuffer(), ansi.GetBuffer(), ansi.GetLength());
    
      return 0;
    }
    


  • Danke,

    statt...
    int _tmain(int argc, _TCHAR* argv[])
    habe ich meinen Knopf genommen.
    Compiliert und er hat mir keine Fehler gemeldet.

    Dann habe ich 4 mal auf "drucken" gedrückt, er hat nicht reagiert.
    Bei 5ten mal hat er
    hallohallohallohallo gedruckt.

    Idee?



  • habs hingekommen 🙂
    ich muss noch \r\n hinzufügen:-)

    tomycat <---- (brüllt wie ein Irrer ich der Wohnung herum und immer wieder"ER DRUCKT ER DRUCKT ERDRUCKT !!!")

    🙂 🙂 🙂 🙂 🙂 🙂



  • ok,
    noch eine Frage:

    was muss ich tun dass er mit das hallo in Fettbuchstaben schreibt und das das Papier abschndet.

    Er druckt mir immer z.b. ESC q e eins zu eins aufs Papier, aber \r\n kennt er?!
    TMT88ii Epson ist sein Name.
    Idee?



  • tomycat2009 schrieb:

    Idee?

    Google ?

    Schon die Suche nach "Epson TMT88i Control Codes" fördert u.a.
    http://webpages.charter.net/dperr/links/esc_p2.htm
    http://www.dragon-it.co.uk/links/epson_printer_codes.htm
    zu Tage



  • Ich setzte voraus, dass ihr beschied wisst,dass ich google nutze und mehrere Stunden herum probiert habe.

    Aber das hättest du auch nicht wissen können 😉 😉 😉

    Dein erster Link:

    1.Versuch:
    CString text = _T("10123123\r\n"); // <== Hier kommen die Druckdaten rein.
    text += "\27EM\1";

    10123123

    EM10123123

    2.Versuch:
    CString text = _T("10123123\r\n"); // <== Hier kommen die Druckdaten rein.
    text += "\ESCk\001";

    ESCEM10123123
    ESCk10123123

    3.Versuch:
    CString text = _T("10123123\r\n"); // <== Hier kommen die Druckdaten rein.
    text += "\ESC-\001";

    ESC-10123123

    Es folgten ca. 30 versuche.Aber nicht zum Ziel 😞

    Idee?(goggle habe ich schon benützt)



  • tomycat2009 schrieb:

    Idee?

    Yoh, hab ich schon mehrmals geschrieben:

    Grundlagen lernen.

    tomycat2009 schrieb:

    Es folgten ca. 30 versuche.Aber nicht zum Ziel 😞

    Das ist auch gut so, da du dich weigerst zu verstehen, was der Code eigentlich tut.

    Ich hab in diesem Thread schon mal geschrieben:

    nn schrieb:

    Du hast es in deinem Programm mit zwei unterschiedlichen Stringformaten zu tun.

    und

    nn schrieb:

    Du must auf jeden Fall zwischen Stringdaten innerhalb deines Programm und denen im Druckerformat unterscheiden. Da bieten sich CStringA (nicht CString) oder std::string für die Druckerdaten an. Letzter kommt auf jeden Fall auch mit Binärdaten zurecht.

    Die Daten in deinem CString sind in UTF-16 codiert.
    http://de.wikipedia.org/wiki/UTF-16
    Denk mal darüber nach, wo du da versuchst ein Escape hinzuzufügen ...

    Anschliessend kannst du mal zu Escapesequenzen googlen und unter anderem das finden:

    http://www.cppreference.com/wiki//language/escape?redirect=1
    http://msdn.microsoft.com/de-de/library/h21280bw.aspx

    Dann kannst du darüber nachdenken, ob \ESC oder \27 die richtige Schreibweise sind.



  • http://webpages.charter.net/dperr/links/esc_p2.htm <-ist nicht für meinen Epsondrucker.Er unterstützt ESC/POS.

    Unter Grundlagen kann man verschiedenes verstehen. Z.Z. hat mein Aktuelles Projekt insgesammt 3000 c++ Zeilen. Aber ich bin zu blöd für den Drucker 😉

    \x1d\x56\x00 schneidet Papier.
    Unter Verzeiflung probiert man willkürlich Kombinationen aus:
    text += "\27EM\1"; oder text += "\ESCk\001"; *lol*

    Aber trotzdem thx für die links und die Anreize 🙂


Anmelden zum Antworten