Forum
C# : LPT-Eingänge lesen -> wie? (Elektronik)
» Stichwort pointer.
»
» Du machst einen Pointer vom Typ integer denk ich mal, und setzt die
» Adresse auf die des Parallelen Ports. Diese ist bei den meisten PCs
» gleich, und kann dem BIOS entnommen werden.
Vermutlich soll das Statusregister (Basisadresse+1) ausgelesen werden, nicht das Datenregister (Basisadresse). Falls nicht, setzt das bestimmte Einstellungen am Parallelport (BIOS) voraus, die längst nicht von jeder Programmierumgebung (und älteren Ports) unterstützt werden. In diesem Fall wäre die Hardware allerdings auch deutlich komplizierter, es ist also unwahrscheinlich. Der Zeiger sollte aber theoretisch auf Typ "Byte" zeigen (unsigned char *zeiger), weil der Parallelport in Bytes "denkt".
Allerdings sollte man tunlichst vermeiden, direkt auf die Hardware zuzugreifen, es sei denn, man programmiert für reines DOS oder einen Kerneltreiber (der sich dann aber auch korrekt im System registrieren muß). Ansonsten sollte man immer Funktionen benutzen, die vom Betriebssystem oder Zusatzbibliotheken systemkonform bereitgestellt werden, weil Fehler mitunter katastrophal sein können (wenn man z.B. versehentlich auf dem Festplattencontroller herumtrampelt).
Da der OP in C# (kenne ich nicht, weil Micro$oft-spezifisch und teils mit Patenten belastet, also für mich unbrauchbar) programmiert, kann ich da nicht viel zu sagen, allerdings schreibt er ja, daß es bereits Ausgaberoutinen für den Parallelport gibt, also gibt es ganz sicher auch entsprechende Eingaberoutinen.
Anscheinend wird eine Bibliothek (inpout32.dll) benutzt, die die Hardware "verbotenerweise" direkt anspricht. Mit:
[DllImport("inpout32.dll", EntryPoint = "Out32"; )]
public static extern void Output(int adress, int value);
[DllImport("inpout32.dll", EntryPoint = "Inp32"; )]
public static extern void Input(int adress, int value);
werden anscheinend zwei Funktionen deklariert und mit der o.g. Bibliothek verlinkt. Die benutzt man dann ganz normal, mit Adresse und Wert als Parameter.
Falls zum Einlesen der Statusport benutzt wird, genügt die Basisadresse+1 als "address", also etwa:
const int basisadresse=0x378;//port Basisaddresse, an verwendeten PC anpassen!
const int statusport=basisadresse+1;//so braucht man bei anderer Basisadresse nur eine Zeile zu ändern
int wert;
Input(statusport,wert);//wert enthält jetzt die Statusbits
Allerdings sieht die Deklaration fehlerhaft aus:
[DllImport("inpout32.dll", EntryPoint = "Inp32"; )]
public static extern void Input(int adress, int value);
Man müßte entweder einen Zeiger oder eine Referenz für den Rückgabeparameter "value" benutzen, es sei denn, C# kennt solche Dinge nicht und jede Variable ist eine Referenz.
Auch sollte der OP nachsehen, ob die Wertparameter (besonders bei "Output" ) tatsächlich vom Typ "int" sind (sollten "byte" oder "unsigned char" sein). Falls ja, und die Ausgaberoutine schreibt auch einen int (normalerweise 4 Bytes), kann das zu Überraschungen führen, weil man beim Parallelport dann alle drei Register (Daten, Status und Steuerung) und eine weitere Speicherstelle unbekannter Funktion beschreibt. Falls die Bibliothek keine byteweise Ausgabe hergibt, hat man ein Problem (wahrscheinlich wird das trotzdem "funktionieren", ist aber trotzdem falsch).
Zum Ausfiltern der relevanten Bits benutzt man logische Operatoren, in diesem Falle "UND" ( & ) statt beim Setzen "ODER" ( | ). (oder wie auch immer die Operatoren in C# heißen mögen):
if(wert&64)//ACK (pin 10) set (= Alarm)
Nervengas_Freisetzen();
else
Kaffee_Kochen();
Hierbei findet dieselbe binäre Bitverschiebung statt wie beim Setzen der Ausgänge: 1,2,4,8,16 usw. für Bits 1,2,3,4,5...
Die Pinbelegung ist:
Bit 8 Pin 11 (invertiert)
Bit 7 Pin 10
Bit 6 Pin 12
Bit 5 Pin 13
Bit 4 Pin 15
Bits 1 bis 3 sind nicht belegt.
Gesamter Thread:
