Benutzer mit den meisten Antworten
Programmierung der parallelen Schnittstelle

Frage
-
Hallo zusammen,
ich möchte gerne die parallele Schnittstelle mit Visual C++ 2010 "ansprechen". Zunächst würde es mir reichen, wenn durch den Programmtext einzelne Pins der Schnittstelle ein- oder ausgeschaltet werden können, das ganze soll erst einmal über eine einfache Konsolenanwendung laufen.
Ich habe bereits erfahren, dass in den neueren Windows-Versionen (ich nutze Win XP) die Schnittstellen nicht direkt angesprochen werden können, sondern ein Treiber benötigt wird. Ich habe lange gesucht und verschiedene Treiber probiert, und nutze jetzt UserPort (http://www.brothersoft.com/userport-122645.html), was mit anderen Programmen, die auf den Port zugreifen wollen, wunderbar funktioniert (z. B. das CAD-Programm Locad oder auch QBasic).
Allerdings weiß ich nicht so recht, wie ich nun genau auf die Schnittstelle zugreifen kann, wenn ich mit C++ arbeite. Unter QBasic habe ich z.B. folgenden Programmtext verwendet, um die Werte der Register abzufragen:
LET Dat%=INP(888) LET Stat%=INP(889) LET Ctrl%=INP(890)
Oder, um ein Register (hier: Data-Register) zu setzen:
INPUT Zahl% OUT(888), Zahl%
Wen es interessiert, kann sich auch noch den kompletten Programmtext zur manuellen Ansteuerung ansehen (nicht objektorientiert programmiert, dafür taugt meine Qbasic-Umgebung nicht wirklich):
1 INPUT "Start(j/n)?"; start$: IF start$ = "n" THEN END ' Portadressen laden Dat% = INP(888) Stat% = INP(889) Ctrl% = INP(890) ' Daten ausgeben CLS PRINT "Data-Pins:" LET DatStr$ = "" FOR n = 0 TO 7 LET DatStr$ = DatStr$ + " " + STR$(Dat% AND 2 ^ n) NEXT n PRINT DatStr$ PRINT "Status-Pins:" LET StatStr$ = "" FOR n = 3 TO 7 LET StatStr$ = StatStr$ + " " + STR$(Stat% AND 2 ^ n) NEXT n PRINT StatStr$ PRINT "Control-Pins:" LET CtrlStr$ = "" FOR n = 0 TO 3 LET CtrlStr$ = CtrlStr$ + " " + STR$(Ctrl% AND 2 ^ n) NEXT n PRINT CtrlStr$ 2 : 'Eingabe INPUT "Setze Data-Bit Nr. (-1 zum Abbrechen)"; Nr% IF Nr% = (-1) THEN GOTO 3 OUT 888, (Dat% OR 2 ^ Nr%) GOTO 2 3 INPUT "Lösche Data-Bit Nr. (-1 zum Abbrechen)"; Nr% IF Nr% = (-1) THEN GOTO 1 OUT 888, (Dat% AND (255 - 2 ^ Nr%)) GOTO 3
Ich hoffe, jemand kann mir helfen und sagen, wie ich ein ähnliches Programm in C++ implementiere. Mir würde auch schon der entsprechende Befehl reichen bzw. die Bibliotheken, die ich dann einbinden muss.
Vielen Danke im Voraus
stes
Antworten
-
Lies Dich mal hier durch:
http://www.lvr.com/parport.htmIn diesem Artikel findest Du alles wissenswerte dazu inkl. Quellen und weiterer Links.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort vorgeschlagen Martin Richter Donnerstag, 15. Juli 2010 14:57
- Als Antwort markiert stes Sonntag, 25. Juli 2010 17:32
-
- Als Antwort markiert stes Sonntag, 25. Juli 2010 17:32
Alle Antworten
-
Lies Dich mal hier durch:
http://www.lvr.com/parport.htmIn diesem Artikel findest Du alles wissenswerte dazu inkl. Quellen und weiterer Links.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort vorgeschlagen Martin Richter Donnerstag, 15. Juli 2010 14:57
- Als Antwort markiert stes Sonntag, 25. Juli 2010 17:32
-
Vielen Dank für die Antwort, allerdings wollen die Beispiele, die ich auf der Seite finde, nicht so richtig funktionieren (ich habe natürlich noch bei weitem nicht alles durchgelesen!).
Wenn ich z.B. den folgenden Quelltext compilieren möchte:
#include <stdio.h> #include <dos.h> #define DATA 0x378 #define STATUS 0x379 #define CONTROL 0x37a void main() { int test; test = inportb(DATA); }
erhalte ich folgende Fehlermeldung:
error C3861: "inportb": Bezeichner wurde nicht gefunden.
Muss ich noch eine zusätzliche Bibliothek oder Headerdatei einbinden, oder ist der Befehl "inportb" einfach falsch? -
Das geht so nicht... sowas geht nur unter DOS.
Also: Entweder Du schreibst ein DOS Programm (geht mit beliebigen freien DOS-Compilern) oder Du erstellst ein Windows Programm, dann musst Du irgendwelche DLLs von Fremdherstellern verwenden... siehe die diversen Links auf der Seite, die Martin Dir schon gezeigt hat...
Jochen Kalmbach (MVP VC++) -
Ok, ich habe mich für letzteres entschieden, die InpOut32.dll heruntergeladen und ein kleines Programm geschrieben:
#include <iostream> using namespace std; short _stdcall Inp32(short portaddr); void _stdcall Out32(short portaddr, short datum); void main() { int a; a = Inp32(0x378); cout << a; }
Der Compiler meckert jetzt nicht mehr, allerdings bekomme ich beim Starten der Anwendung folgende Fehlermeldung:
"Die Anwendung konnte nicht gestartet werden, weil INPOUT32.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben."
Und das, obwohl die DLL zum Projekt hinzugefügt wurde und im Projektmappen-Explorer angezeigt wird -.-
-
- Als Antwort markiert stes Sonntag, 25. Juli 2010 17:32