Parallelport beschreiben mit /dev/lp0

D

Dirk

Mitglied
Moin!
Ich möchte Bits des Parallelports setzen, um damit eine kleine elektronische Schaltung zu steuern. Ich habe dafür zwei Varianten gefunden:
1.) direktes Beschreiben des Ports per outb()
2.) Verwendung der Gerätedatei /dev/lp0

Ersteres funktioniert tadellos, nur benötigt das Programm root-Rechte, daher kommt es für mich nicht in Frage.

Bei der zweiten Variante habe ich Probleme. Ich mache folgendes:
Code:
int fd = open( "/dev/lp0", O_RDWR );
lseek( fd, 1, SEEK_SET );
unsigned char wert = 255;
write( fd, &wert, sizeof( wert ) );
close( fd );
Das Programm läuft bis write() durch, bleibt aber beim Schreiben hängen.
Wenn ich nen zufälligen String in /dev/lp0 schreibe, z.B. durch:
Code:
cat datei > /dev/lp0
Kommt der Befehl auch nicht zum Ende, sondern bleibt stecken.

Woran kann das liegen? Hab ich das Prinzip so einer Gerätedatei falsch verstanden??

Vielen Dank für eure Hilfe!

Mfg Dirk
 
Hi Dirk,

was erwartest Du, was denn passiert, wenn Du mit
cat datei > /dev/lp0
etwas rauspumpst und kein lineprinter antwortet auf
den Steuerleitungen, so wie spezifiziert?

Es gibt da ein gutes Buch, das ich mir mal besorgt
habe. Es heisst
"Messen, Steuern, Regeln mit Linux"
beim Franzis-Verlag.

Ist meiner Meinung nach sehr verstaendlich und enthaellt
viele Beispiele mit Source-Code z.B. fuer die Ansteuerung
von Schrittmotoren ueber parallele oder serielle
Schnittstelle oder Abgreifen von Temperatursensoren
ueber I2C-Bus.

Ich meine, dieses Buch sogar mal irgendwo online
entdeckt zu haben. Try google.

Das Thema Parallelport hatte aus diesem Buch ich
dankbar entgegen genommen, da ich
"nur mal eben eine LED" anmachen
wollte an Pin 1 und verzweifelt bin an den gleichen
Problemen wie Du.

Soweit ich mich erinnern kann, ist die Ansteuerung im
User-Mode aber nicht trivial, aehnlich wie die Ansteuerung
von Sound ueber ALSA begibst Du Dich in ein API-Grab.

Ich waehlte letztlich den Weg ueber einen root-daemon,
so wie Du eingangs beschrieben hast mit outb().

Was spricht bei Deiner Anwendung dagegen? Wenn Du
mit Sicherheit der einzige bist, der auf diesem Port was
machen will, so gehe doch diesen Weg.

Du koenntest z.B. einen daemon schreiben, so wie gpsd,
der als root laeuft und die bits setzt. Fuer den user legst
Du einen socket an, zu dem Du dich als user verbinden
kannst. Und schon ist Deine Steuerung sogar remote-faehig!

Gruesse

maggus
 
Paraphin ist ne nette kleine lib und gut dokumentirt des würde ich mal versuchen
 
Vielen Dank für eure Antworten!
Das mit dem Daemon ist eigentlich ne ganz gute Idee, aber mir vorerst etwas zu viel Aufwand. Ich werde mal einen Blick auf die Parapin-Lib riskieren :-)

Dirk
 
Ein anderer Ansatz waere ein Kernel-Modul, das die Ansteuerung uebernimmt und ein entsprechendes Interface fuer Programme zur Verfuegung stellt, das aus dem Userspace angesprochen werden kann (z.B. ueber das proc-Interface). Als Vorlage kann man ja das parport-Modul nehmen und dieses entsprechend modifizieren bzw. erweitern.
 
mein lp0-Port habe ich gerade vom Drucker befreit und will jetzt darüber Steckdosen Aus- und Einschalten.
Mit der Scriptsprache Tcl/Tk geht das ganz einfach. Ein vollständiges Programm ist aber noch nicht fertig
1. Root-Rechte für /dev/lp0 : da ich keinen Drucker mehr daran benutze, habe ich mit
chown root.users /dev/lp0 nur die Gruppe (bisher lp) geändert und habe so als user
Schreibzugriff
2. Wenn kein externes Gerät angeschaltet ist, bedeutet ein offenes BUSY-Pin
"Gerät nicht bereit" . Alle Ausgaben werden irgendwo gepuffert und kommen nicht
an den Daten-Pins (Pin 2,3,4,... ) an. Also BUSY (Pin 11) mit GND (Pin 18 bis 25)
verbinden.
3. Tcl/Tk war bisher bei SuSE immer auf den CD's
Auf einer Konsole tclsh aufrufen und nach wenigen Schritten kann man an der Buchse
(Pin 2 bis 8 ) low- oder high- Pegel messen:
Also tclsh
% set pp [open /dev/lp0 w ] ; # port für Schreiben geöffnet
% fconfigure $pp -buffering none ; # Daten werden jetzt sofort geschrieben
% fconfigure $pp -blocking 0 ; # kein Warten auf ...
% puts -nonewline $pp \xff ; # alle Datenleitungen auf high gesetzt
% puts -nonewline $pp \x00 ; # alle Datenleitungen auf low gesetzt
% close $pp
% exit

Das ganze sollte auch unter Windows laufen (aber nicht mit /dev/lp0 sondern mit LPT ? )
Irgendwann läuft auch mein Programm mit grafischer Bedienung (Tcl/Tk)
Gruß Günter
 
Zuletzt bearbeitet:
So schnell geht's mit Tcl/Tk. Die erste Version eines Programms mit grafischer Bedienoberfläche zum Aus-/Einschalten der 8 Paralleport-Datenleitungen ist fertig.
Sollten zu viele Wünsche eingehen, werde ich es auch ins Netz stellen.

MFG Günter
 
Es sah so schön aus. Die Datenausgabe von 00H bis FFH auf Device /dev/lp0 funktioniert.
Jede Datenleitung am Parallelport kann so auf high oder low gesetzt werden.
Damit wollte ich - und ich kann aus auch - u.a. meinen USB-Drucker aus- und einschalten.
Bei SuSE (nur bei SuSE ?) werden aber nach jedem Booten für /dev/lp0 die Rechte neu
gesetzt (auch wenn kein Printer angeschaltet und auch nicht konfiguriert ist).
Wie schaltet man das ab ? Ich hab's noch nicht gefunden.
Der Schritt, irgendwo ein "privates" Device mit mknod lpPrivat c 6 0 anzulegen umgeht das Problem.
Viel schimmer ist aber, dass die Benutzung der Tabulator-Taste oder der Cursor-Tasten
eine Daten-Ausgabe -offensichtlich auf niedrigster Ebene- auf das Parallelport bewirkt.
Damit wird mein Drucker einfach wieder ausschaltet.
Gibt es eine bessere Erkärung als:
"Niemand hat das Recht das Parallelport für eigene Zwecke zu benutzen" ?
 
meinen Beitrag, dass es doch geht, hat wohl jemandem nicht gefallen? Der ist verschwunden!
Also ganz kurz: Benutze nie die 8 Datenleitungen direkt. Schalte ein 8-Bit-Latch dazwischen und mache die Eingänge nur auf, wenn STROBE aktiv ist.
Irgendwo habe ich das auch genauer beschreiben.
 
Tachchen... grabe mal eine fast vergammelte Leiche aus! :D

Möchte mich auch etwas mit dem Thema beschäftigen über C/C++ meinen LPT oder COM Port anzusteuern und damit z.B. ein Led anschalten oder sogar auf einen kleinen Puls warten wie z.B. Stromkreis offen oder zu! :)

Das Buch "Messen, Steuern, Regeln mit Linux" ist bei Amazon derzeit vergriffen und doch noch etwas teuer für den Anfang. Von daher kann mir einen vieleicht einen netten link für ein eBook geben und/oder eine Übersicht über die PINs welche Nummern die haben etc?

Das wäre super nett... Danke

Yellow
 
Hey JBR. Danke für die Coole Seite!

Die wird mir auf jedenfall erstmal weiterhelfen :D
 

Ähnliche Themen

LED ansteuern per /dev/lp0

Pipefehler unter Solaris 10 X86

serielle schnittstelle

verzweifle an RS232

Zurück
Oben