• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] mit Parallel Port digitale I/O's ansteuern

superbike

Member
Hallo Leute,
ich möchte aus der Konsole bzw. mit bash am Parallelport einzelne Pins als digitale Ausgänge ansteuern.
Hardwaremässig habe ich genügend Dokus gefunden (Pinbelegung, Schaltung usw. hier oder da )

Suche aber noch den entscheidenden Tipp, wie ich per bash Commands Ausgänge setzen bzw. Eingänge abfragen kann .
:oops: wer kann mir weiterhelfen? :oops:
 

Kurt M

Hacker
ich fürchte das geht gar nicht, da die Ports nicht so ohne weiteres zugänglich sind.
Denn ansonsten könnte man ja aus der Konsole jedem Druckvorgang ein paar falsche Bits unterjubeln.
Wenn Du C anstelle bash nehmen könntest, dann kannst du ein Programm
schreiben um den Treiber zu bedienen mit dem du Zugriff auf den Port bekommst.
Da gibts einige Beispiele dafür, aber du musst halt C können.

Es könnte sein dass es in C sogar ohne Treiber mit ioperm und iopl geht, hab ich aber noch nicht gemacht. Dann wäre es einfach.

Dieses C-Programm kannst du dann aus der bash aufrufen.

Gruß
Kurt
 

Kurt M

Hacker
ich hatte gerade nicht besseres zu tun :) und habs schnell eingetippt:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>

#define port 0x378

int main(int argc, char *argv[])
{
if(argc!=2) {
    fprintf(stderr,"falsche Parameteranzahl\n");
    exit(0);
}

int wert = atoi(argv[1]);

if(!(wert>=0 && wert<=255)) {
    fprintf(stderr,"falscher Parameterwert\n");
    exit(0);
}

if (ioperm(port,3,1)!=0)
{
    fprintf(stderr,"kein Zugriff. Muss als root laufen !\n");
    exit(1);
}

outb(wert,port);

ioperm(port,3,0);

return 0;
}

Kopier dir den Code hier raus und in eine Datei test.c hinein.
Diese kompilierst du dann mit
Code:
cc -o test test.c
heraus kommt das Programm test.
Dieses rufst du aus der Konsole so auf:
./test wert
wobei wert der Dezimalwert ist, den du an den Druckerport rausschreiben willst.
Soll also das Bit 0 gesetzt werden dann ist der wert 1 usw. bis Bit 7 den wert 128 bekommt (also 1,2,4,8,16,32,64 und 128 für die Bits).
Willst du mehrere Bits setzen so addierst du die Zahlen.

Ich hab nicht getestet ob sich am Druckerport was rührt, hab grad kein Messgerät zur Hand, aber so sollte es eigentlich gehen.

Alles natürlich als root, sonst geht nix weil einem normalen User solche direkten Zugriffe verwehrt sind. Da müßte man dann mit Treibern arbeiten.

Achso, wenn du einen Wert abfragen willst.
Dann mach das Programm nochmal unter anderem Namen und ändere nur die letzten Zeilen ab:
Code:
int auslesewert=inb(port);

ioperm(port,3,0);

return auslesewert;
}
Am Anfang sollte man dann noch die Abfrage wegen der Parameter entfernen, weil man ja hier keine eingibt.

Gruß
Kurt
 
OP
S

superbike

Member
Kurt M schrieb:
ich hatte gerade nicht besseres zu tun :) und habs schnell eingetippt:
:D Danke Dir!
Das Schreiben funktioniert einwandfrei, hab das Multimeter zur Hand. Das Einlesen nicht mit:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>

#define port 0x378

int main()
{

if (ioperm(port,3,1)!=0)
{
    fprintf(stderr,"kein Zugriff. Muss als root laufen !\n");
    exit(1);
}

int auslesewert=inb(port);

ioperm(port,3,0);

return auslesewert;
}
:oops: ... weil ich was falsch habe ... :?:
 
OP
S

superbike

Member
jengelh schrieb:
... Deine Refernzen waren wohl nicht richtig?
...ja in der Art, habe schlicht den Returncode falsch abgefragt in meiner Bash (ohne $ Fragezeichen).
Code:
#!/bin/sh
#
./test_input
Resultat=$?
echo "Rückgabewert =$Resultat ."
Übrigens hier noch ein schönes Script zum Thema.
Danke für Eure Unterstützung.
 
Hallo Leute

den Code habe ich ebenfalls kopiert und getestet.
Es kommen keine Fehlermeldungen soweit sogut.
Aber wie genau ist die Steuersyntax.

Pintest ist mein kompilites File

./PINTEST [1-255]
das geht einwandfrei aber was macht das Prog. bei folgendem Befehl?
./PINTEST [1-255],[1-255],[1-255],[1-255]
geht auch.

Oder was muss ich eingeben um ganz gezielt den pin Nr 2 auf der LPT schnittstelle zu setzen.
lg Krossfire
 
Alles klar es hat funktioniert.

Bestimmt kann man mit diesem Programm auch ander Schnittstellen wir z.B, die RS232 ansteuern. Ich werde dass mal am Wochenende testen
lg schumi
 
Oben