Drucker ansteuern

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
detewe89
Beiträge: 15
Registriert: So Okt 05, 2008 11:07 am

Drucker ansteuern

Beitrag von detewe89 » Mi Dez 01, 2010 3:24 pm

Hi an alle

So, neues Problem, neues Glück :P
Ich wollte einfach mal versuchen, den Drucker mit einem C/C++ Programm anzusprechen, bin aber schnell nicht weiter gekommen, vor allem, da eine Fehlersuche jemandem mit meinem Kenntnisstand schwer fällt.

Ich hab mal das Programm von diesem Forum compiliert, und natürlich hat der Drucker keinen Mucks von sich gegeben.
Das Einzige, was ich verändert habe, war, das "LPT1" gegen "/dev/usb/lp0" auszutauschen.

Zwei Fragen:

1. Was kann ich allgemein tun, um solchen Fehlern näher zu kommen und sie zu beheben.
2. Das C++ Programm lief schonmal gar nicht, weil der Compiler den Namespace beanstandet hat. Gibt es im Netz eine Referenz, in der ich zu jeder Funktion den passenden Namespace finde??

Danke!! ;)
LG
Daniel

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Drucker ansteuern

Beitrag von cloidnerux » Mi Dez 01, 2010 4:50 pm

1. Was kann ich allgemein tun, um solchen Fehlern näher zu kommen und sie zu beheben.
Prüfen ob etwas gesendet wird bzw. ob dein Drucker was Empfängt., natürlich sollte dein Drucker dann auch am LPT1 hängen.
Das C++ Programm lief schonmal gar nicht, weil der Compiler den Namespace beanstandet hat. Gibt es im Netz eine Referenz, in der ich zu jeder Funktion den passenden Namespace finde??
Dein Compiler kennt den namespace "std" nicht???? den "Stdandard-Namespace aus der iostream und einigen weiteren headern?
Bist du dir sicher, dass du die richtigen Headers verwendest?
Redundanz macht wiederholen unnötig.
quod erat expectandum

MoonGuy
Beiträge: 231
Registriert: Fr Okt 08, 2010 2:49 pm

Re: Drucker ansteuern

Beitrag von MoonGuy » Mi Dez 01, 2010 5:27 pm

cloidnerux hat geschrieben:
Das C++ Programm lief schonmal gar nicht, weil der Compiler den Namespace beanstandet hat. Gibt es im Netz eine Referenz, in der ich zu jeder Funktion den passenden Namespace finde??
Dein Compiler kennt den namespace "std" nicht???? den "Stdandard-Namespace aus der iostream und einigen weiteren headern?
Bist du dir sicher, dass du die richtigen Headers verwendest?
using namespace std; muss bei manchem Compilern direkt unter #include <iostream> stehen, sonst findet er nicht den dazugehörigen Header.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Drucker ansteuern

Beitrag von Xin » Mi Dez 01, 2010 6:03 pm

detewe89 hat geschrieben:1. Was kann ich allgemein tun, um solchen Fehlern näher zu kommen und sie zu beheben.
Vorrangig üben und immer mehr lernen, bist Du ein Gespür dafür bekommst.

Ansonsten kommt die Handlung auf den Fehler an, bzw. wie er sich äußert. Womit wir wieder beim Lernen ist.

Gibt es das Gerät /dev/usb/lp0?
Und hängt da ein Drucker dran?
Was passiert wenn Du "echo "Test" > /dev/usb/lp0 eingibst?
detewe89 hat geschrieben:2. Das C++ Programm lief schonmal gar nicht, weil der Compiler den Namespace beanstandet hat. Gibt es im Netz eine Referenz, in der ich zu jeder Funktion den passenden Namespace finde??
Schau mal im Wiki unter FAQ/Frage formulieren.

Dein Code und die Compilerausgabe mit hinweis, wo welche Zeile ist... ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
detewe89
Beiträge: 15
Registriert: So Okt 05, 2008 11:07 am

Re: Drucker ansteuern

Beitrag von detewe89 » Do Dez 02, 2010 10:32 pm

Hier nochmal der Programmcode, den ich auf besagtem Forum gefunden hatte:

Code: Alles auswählen

// C++-Version
#include <iostream>
#include <fstream>
using namespace std;

int main ()
{
    ofstream printer ("LPT1");
    if(!printer)
    {
        cerr << "Drucker konnte nicht gefunden werden, bzw. ist nicht eingeschaltet." << endl;
        return 1;
    }

    printer.puts("Test Test Test\n");
    printer.putc('\f');

    printer.close();

    return 0;
} 
cloidnerux hat geschrieben:Bist du dir sicher, dass du die richtigen Headers verwendest?
Ich denke ja, also ich hab das Programm einfach in den Editor kopiert und versucht, zu kompilieren.
Der Compiler hat Folgendes ausgespuckt:

Code: Alles auswählen

daniel@daniel-laptop:~/Desktop$ g++ -Wall -o print print.cpp
print.cpp: In function ‘int main()’:
print.cpp:18: error: ‘struct std::ofstream’ has no member named ‘puts’
print.cpp:19: error: ‘struct std::ofstream’ has no member named ‘putc’
Xin hat geschrieben:Gibt es das Gerät /dev/usb/lp0?
Und hängt da ein Drucker dran?
Was passiert wenn Du "echo "Test" > /dev/usb/lp0 eingibst?
Ich schätze mal, dass es der Drucker sein muss (es ist ein USB-Drucker, er war eingeschaltet, und die Gerätedatei existiert auch!!). Ich habe das auch mit /dev/lp0 und mit /dev/usblp0 probiert ... nichts ist passiert. Bei dem von Dir vorgeschlagenen BASH-Befehl auch nicht...
Normalerweise findet sich die Gerätedate des Druckers anscheinend in der /etc/printcap, aber die gibt nichts her:

Code: Alles auswählen

daniel@daniel-laptop:~/Desktop$ cat /etc/printcap
# This file was automatically generated by cupsd(8) from the
# /etc/cups/printers.conf file.  All changes to this file
# will be lost.
Stylus-DX4000|EPSON Stylus DX4000:rm=daniel-laptop:rp=Stylus-DX4000:
Ich hoffe, ich habe das Problem jetzt ausführlicher dargestellt. Entschuldigung für meine Thread-Eröffnung!

Daniel

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Drucker ansteuern

Beitrag von cloidnerux » Do Dez 02, 2010 10:48 pm

es ist ein USB-Drucker
Da liegt der Hase im Pfeffer.
Dein USB-Drucker ist auch als USB gerät im System und wird von cups angesteuert. Deine Methode, die du hier verwenden willst setzt aber ein Drucker auf LPT1, der Parallelen Schnittstelle(SUB-D, 2 Reihig, ~15 Pole pro Reihe, meistens rot) voraus, der zudem noch das alte einfache Nur-Text-printing unterstützt. Das sind 2 Faktoren, die du wahrscheinlich für deinen neuen USB-Drucker ausschließen kannst.
Ich denke ja, also ich hab das Programm einfach in den Editor kopiert und versucht, zu kompilieren.
Der Compiler hat Folgendes ausgespuckt:

Code: Alles auswählen

    daniel@daniel-laptop:~/Desktop$ g++ -Wall -o print print.cpp
    print.cpp: In function ‘int main()’:
    print.cpp:18: error: ‘struct std::ofstream’ has no member named ‘puts’
    print.cpp:19: error: ‘struct std::ofstream’ has no member named ‘putc’
http://www.cplusplus.com/reference/iostream/ofstream/
Du gibst ofstream Daten per "<<":

Code: Alles auswählen

printer << "Hallo Welt!" ;
printer << '\f';
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
detewe89
Beiträge: 15
Registriert: So Okt 05, 2008 11:07 am

Re: Drucker ansteuern

Beitrag von detewe89 » Mo Dez 06, 2010 7:01 pm

Vielen lieben Dank @cloidnerux :) Das korrekte Überladen hat geklappt, der Drucker war mit root über /dev/usb/lp0 ansprechbar und hat den Text ausgespuckt!!
Jetzt frage ich mich nur, wo man diese tolle Schreibmaschinenschrift herbekommt... (diese ganzen Mono-Schriften sind ja nur Klone und sehen nicht sehr authentisch aus...)

LG
Dani

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Drucker ansteuern

Beitrag von cloidnerux » Mo Dez 06, 2010 7:21 pm

Jetzt frage ich mich nur, wo man diese tolle Schreibmaschinenschrift herbekommt... (diese ganzen Mono-Schriften sind ja nur Klone und sehen nicht sehr authentisch aus...)
Willst du jetzt auch noch die Schrift bestimmen, beim Ausdrucken?
Soweit ich das sehe, funktioniert das nicht über die Nur Text Methode.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Drucker ansteuern

Beitrag von Xin » Mo Dez 06, 2010 7:35 pm

cloidnerux hat geschrieben:Soweit ich das sehe, funktioniert das nicht über die Nur Text Methode.
Drucker haben häufig eingebauten Schriftarten und die kann man über Escape-Sequenzen ändern.

Früher gab es bei Druckern noch Handbücher, da stand das alles drin, heute geht das vermutlich eher über die Druckertreiber, bzw. es wird nur noch Grafik gedruckt. Handbücher hatte ich bei den Druckern der letzten Jahre jedenfalls nicht mehr.
Wenn Du die Daten jedoch direkt an den Anschluss schickst, dann hast Du keinen Druckertreiber und musst die Escape-Sequenzen selbst generieren.

Hallo PCL?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten