Seite 1 von 1

Drucker ansteuern

Verfasst: Mi Dez 01, 2010 3:24 pm
von detewe89
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

Re: Drucker ansteuern

Verfasst: Mi Dez 01, 2010 4:50 pm
von cloidnerux
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?

Re: Drucker ansteuern

Verfasst: Mi Dez 01, 2010 5:27 pm
von MoonGuy
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.

Re: Drucker ansteuern

Verfasst: Mi Dez 01, 2010 6:03 pm
von Xin
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... ^^

Re: Drucker ansteuern

Verfasst: Do Dez 02, 2010 10:32 pm
von detewe89
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

Re: Drucker ansteuern

Verfasst: Do Dez 02, 2010 10:48 pm
von cloidnerux
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';

Re: Drucker ansteuern

Verfasst: Mo Dez 06, 2010 7:01 pm
von detewe89
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

Re: Drucker ansteuern

Verfasst: Mo Dez 06, 2010 7:21 pm
von cloidnerux
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.

Re: Drucker ansteuern

Verfasst: Mo Dez 06, 2010 7:35 pm
von Xin
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?