www.mikrocontroller.net

Forum: PC-Programmierung [Linux] String auf Druckerport schicken


Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich suche nach einer einfachen Möglichkeit möglichst aus einer einfachen 
C-Funktion (Loadable Extension Function bzw. Virtual Table in der 
embedded database engine SQLite3) heraus einen String auf den einzigen 
(bzw. einen bestimmten von mehreren) Druckerport schicken zu können. Da 
ich meine LEF in C sowohl mit Delphi (BDS2006) unter WinXP als auch 
Linux compilieren, binden und benutzen kann, sollte die Lösung möglichst 
plattformunabhängig sein.

Kann mir jemand sagen, wie ich das am elegantesten umsetzen kann? - Habe 
in einem anderen Beitrag bereits etwas mit fopen("prn","w") gefunden, 
aber ist das eine solche Lösung? Oder ist prn nur unter Win bekannt?

Meine Anwendung sieht so aus, daß ich von mehreren Druckern die Daten 
(parallel-seriell gewandelt, inclusive aller Steuerzeichen für den 
Drucker) einsammle und zwischenspeichere und dann in einem Rutsch 
jeweils eine komplette Seite drucken will, sobald dafür die Datenmenge 
ausreichend ist.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach den Drucker-Device-File in /dev auf und schreib dort deinen Text 
rein.

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin in Linux noch nicht sehr firm, daher frage ich. Meine Bücher 
haben mir da leider noch nicht sehr viel weiter geholfen oder ich habe 
die entsprechenden Stellen übersehen. Wie heißt das Device-File des 
Druckers? Gibt es in Linux so etwas ähnliches wie in Windows, wo ein 
"Generic Text"-Drucker eingerichtet werden muß? Oder gibt es den schon 
im Standard? Es handelt sich in meinem Falle um Fedora Linux. Am Ende 
öffne ich mit hFile=fopen("/dev/????","w") und kann dann mit 
fwrite(hFile,"string") auf die Druckerschnittstelle schreiben und mache 
dann mit fclose(hFile) wieder zu; ist das richtig?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Unfug findest du unter Linux so nicht.
Wenn du einen Schnittstelle öffnest, ist das dann halt so, Punkt aus und 
Ende. Da pfuscht dir kein Druckertreiber mehr dazwischen.

Ordentlich Drucken tut man deshalb z.B. mit dem Drucksystem CUPS, das 
sorgt dann dafür, dass einer nach dem Anderen druckt. Außerdem werden 
die Druckdaten vorher dem Drucker mundgerecht aufgearbeitet.

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst einmal Danke. Leider hilft mir das mit CUPS nicht viel weiter, denn 
ich habe erst Anfängerkenntnisse mit Linux. Eher schon hilft mir das mit 
dem /dev von uhu, sofern ich noch in Erfahrung bringen kann, wie der 
Teil heißt, der dahinter noch fehlt. Die Daten, die ich 
zwischengespeichert habe, sind ja schon für den entsprechenden 
Druckertyp (Nadeldrucker) aufbereitet. Lediglich habe ich viele davon 
von verschiedenen Eingängen und sammle sie alle in einer 
SQLite3-Datenbank, bis für einen davon soviele beisammen sind, daß sie 
eine ganze Seite füllen. Ich habe also die aufbereiteten Daten für eine 
ganze Seite beisammen in einem String. Doch wie bekomme ich den an den 
Druckerausgang? Und zwar aus einer C-Funktion heraus!? Alternativ könnte 
ich die Funktion system("") auch mit einem (mir bisher noch unbekannten) 
bash-Kommando füllen und aufrufen, aber das wäre keine direkte sondern 
eine indirekt Ausführung, was ich lieber vermeiden möchte.
Wonach muß ich in /dev suchen, um den Druckerausgang zu finden?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Erst einmal Danke. Leider hilft mir das mit CUPS nicht viel weiter, denn
> ich habe erst Anfängerkenntnisse mit Linux.

http://tldp.org/HOWTO/Printing-Usage-HOWTO-2.html

Autor: SD-Fritze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Teste mal /dev/lp*n* wobei n die Windoofportnummer -1 ist.

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf, danke für den Link. Habe (per VPN und PuTTY-SSH) mal unter /dev 
nachgeschaut. Ich finde lp0 bis lp3, parport0 bis parport3 und port aber 
nicht wie beschrieben lp oder print. Ich kann auch mit lpr und lpq keine 
Info über angeschlossenen Drucker bekommen. Ich denke, das ist noch 
nicht installiert. Funktioniert dann lp0 für den Parallelport auf dem 
Mainboard trotzdem? Worin besteht der Unterschied zwischen /dev/lp0 und 
/dev/parport0? Ist /dev/port vielleicht die richtige Wahl. Ich würde 
mich sehr freuen, wenn mir da einer weiterhelfen könnte eine Antwort 
drauf zu bekommen. Danke.

Autor: *.* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
/dev/parport0 hört sich gut an

Autor: Bernhard Walle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sag mal, hast du das Ganze auch mal probiert? Ich mein, ein

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    FILE *fp;

    fp = fopen("/dev/lp0", "w");
    if (!fp) {
        perror("Cannot open /dev/lp0");
        return EXIT_FAILURE;
    }

    if (fwrite("Test", 4, 1, fp) != 4) {
        perror("Could not write to /dev/lp0");
        return EXIT_FAILURE;
    }

    fclose(fp);

    return EXIT_SUCCESS;
}

ist doch jetzt schnell getippt ... und kompiliert.


Bernhard

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sag mal, hast du das Ganze auch mal probiert?
Nein, kann ich nicht so einfach, denn das Ganze wird auf einem Rechner 
in Malaysia ausgeführt werden und der ist aktuell bis Januar 
ausgeschaltet und ein anderer Rechner, der mir als Entwicklungsrechner 
dient, ist anders angeschlossen.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Namen des Devicefiles kann man leider nicht ex cathedra verkünden - 
die variieren je nach Distribution.

lp<n> und parport<n> sind gute Kandidaten. Um herauszufinden, welcher 
File zum Drucker gehört, kann man folgendes Kommando probieren:

   echo "Hurra, er druckt" >/dev/printer

Man muß eben für printer die Device-Files durchprobieren, die 
möglicherweise zum Drucker gehören.

Autor: Bernhard Walle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich weißt du die Nummer der Gerätedatei nicht vorher weil ein
Computer über mehrere Parallelports verfügen kann. Das ist aber unter
Windows das Gleiche, du musst in deinem Programm wohl eine Option
vorsehen.

/dev/parportN und /dev/lpN sind aber was ganz anderes. Während
/dev/parportN Dir den direkten Zugriff auf den Parallelport gibt (der
zugehörige Treiber heißt "ppdev" und normalerweise solltest du
/dev/parportN nicht direkt über entsprechende ioctl()-Aufrufe verwenden
sondern über die libieee1284) ist /dev/lpN nur für Drucker gedacht.
Dafür kümmert sich hier der Treiber von selber um Steuerleitungen und
Handshaking während du das bei /dev/parportN selber machen müsstest.

Zur Druckeransteuerung deshalb /dev/lpN, für sonstige Geräte am
Parallelport wie ein Scanner oder auch ein ZIP-Laufwerk (wobei es hier
einen entsprechenden Kerneltreiber gibt da man das Ganze dann ja als
Blockdevice ansprechen muss) oder irgendwelche Basteleien /dev/parportN.

Dass sich die Nummern je nach Distribution unterscheiden bezweifle ich.
Sicherlich kannst du über enstpechende Udev-Regeln da alles mögliche
machen oder statt erst udev gar nicht verwenden, neue Distributionen
sind aber in dem Punkt hinreichend gleich so dass /dev/lp0 in 99.9 % der
Fälle der erste und einzige Parallelport des Mainboards ist. Wie LPT1
halt unter Windows.


Bernhard

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uhu, danke für diesen Tip. So hatte ich das unter WinXP auch probiert, 
um den Parallel-Seriell-Converter zu testen; Ausgabe auf LPT1: 
umgeleitet.

Bernhard, danke für Deine Erklärungen, das macht für mich Sinn und 
beantwortet meine Fragen. Werde das erst einmal mit lp0 und Knoppix 
ausprobieren und mir dann von meinem Assistenten in Malaysia 
zurückmelden lassen, ob und wie das Ergebnis auf dessen Drucker 
aussieht.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich kann auch mit lpr und lpq keine Info über angeschlossenen
> Drucker bekommen. Ich denke, das ist noch  nicht installiert.

Ja. Dazu müßte der passende Druckertreiber eingerichtet sein.

> Funktioniert dann lp0 für den Parallelport auf dem Mainboard
> trotzdem?

Ja.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernhard Walle wrote:

> Dass sich die Nummern je nach Distribution unterscheiden bezweifle ich.

Na ja, es ist ja immerhin möglich, daß es einen USB- und einen 
Parallel-Drucker gibt - schon ist die Eindeutigkeit dahin und hängt von 
der Distribution ab.

Autor: Bernhard Walle (bwalle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uhu Uhuhu wrote:
> Bernhard Walle wrote:
>
>> Dass sich die Nummern je nach Distribution unterscheiden bezweifle ich.
>
> Na ja, es ist ja immerhin möglich, daß es einen USB- und einen
> Parallel-Drucker gibt - schon ist die Eindeutigkeit dahin und hängt von
> der Distribution ab.

Ein USB-Drucker erhält die Gerätenamen /dev/usblpN, insofern besteht da 
kein Konflikt. Wenn du das Programm wirklich universell verwendbar haben 
willst machst du (sofern es ein GUI-Programm ist) eine editierbare 
Combobox die alle verfügbaren Parallelports anbietet (/dev/lpN und 
/dev/usblpN) und zugleich die Möglichkeit bietet, für Expertennutzer 
eigenen Ports anzugeben.

Für die Kommandozeile oder über eine Konfigurationsdatei kannst du eine 
Option angeben über den man direkt den Gerätenamen einstellen kann. 
Default ist natürlich /dev/lp0, was eben in 95 % der Fälle der 
gewünschte Drucker ist.

Bernhard

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Tips. Ich habe einfach mal ausprobiert mit meiner 
verfügbaren Funktion, die ich sonst zum Loggen in eine Datei verwende, 
auf /dev/lp0 zu schreiben. Es gab keine Fehler aber leider kann ich das 
Ergebnis nicht einfach so begutachten, denn die Geräte stehen in anderen 
Ländern. Ich lasse es Euch wissen, sobald ich Testgelegenheiten hatte.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernhard Walle wrote:
>> Na ja, es ist ja immerhin möglich, daß es einen USB- und einen
>> Parallel-Drucker gibt - schon ist die Eindeutigkeit dahin und hängt von
>> der Distribution ab.
>
> Ein USB-Drucker erhält die Gerätenamen /dev/usblpN, insofern besteht da
> kein Konflikt.

Dann wirst du mir sicher erklären können, warum es auf meinem Ubuntu 
7.10 ein /dev/lp0 gibt, obwohl die Maschine keine parallele 
Schnittstelle hat.

Autor: *.* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Phantomschmerzen

Autor: Bernhard Walle (bwalle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uhu Uhuhu wrote:
>
> Dann wirst du mir sicher erklären können, warum es auf meinem Ubuntu
> 7.10 ein /dev/lp0 gibt, obwohl die Maschine keine parallele
> Schnittstelle hat.

Weil die Schnittstelle vermutlich existiert (von den I/O-Ports her) und 
nur nicht nach außen geführt wird.


Bernhard

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Gruppe muß ein User angehören, um auf /dev/lp0 senden zu dürfen?
Von der seriellen Schnittstelle /dev/ttyS0 meine ich zu wissen, das es 
uucp ist aber welche ist es für die parallele Schnittstelle?

Autor: Micha S. (ernie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred wrote:

Hallo,

> Welcher Gruppe muß ein User angehören, um auf /dev/lp0 senden zu dürfen?
> Von der seriellen Schnittstelle /dev/ttyS0 meine ich zu wissen, das es
> uucp ist aber welche ist es für die parallele Schnittstelle?

michael@ernie01:~> ls -l /dev/lp0
crw-rw----  1 root lp 6, 0 2005-03-19 23:01 /dev/lp0
                   ^^

Da würde ich glatt mal behaupten das ist die Gruppe lp.
Gruesse,

Michael

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, da hätte ich ja glatt selbst drauf kommen können.

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem Senden auf /dev/lp0 funktioniert hervorragend.
Ja, es war die gruppe lp der ich meinen user zufügen mußte, so wie 
zuvor der uucp für den Zugriff auf serielle Schnittstellen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.