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
ESCk101231233.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.aspxDann 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