none
Programmierung der parallelen Schnittstelle RRS feed

  • 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

    Donnerstag, 15. Juli 2010 14:44

Antworten

  • Lies Dich mal hier durch:
    http://www.lvr.com/parport.htm

    In 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
    Donnerstag, 15. Juli 2010 14:56
  • Und das, obwohl die DLL zum Projekt hinzugefügt wurde und im Projektmappen-Explorer angezeigt wird -.-

    Du musst sicherstellen, dass die DLL im selben Verzeichnis wie die EXE steht! Du musst sie also einfach noch in das Debug/Release Verzeichnis kopieren.


    Jochen Kalmbach (MVP VC++)
    • Als Antwort markiert stes Sonntag, 25. Juli 2010 17:32
    Sonntag, 25. Juli 2010 14:42

Alle Antworten

  • Lies Dich mal hier durch:
    http://www.lvr.com/parport.htm

    In 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
    Donnerstag, 15. Juli 2010 14:56
  • 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?

    Donnerstag, 15. Juli 2010 17:36
  • 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++)
    Donnerstag, 15. Juli 2010 18:19
  • 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 -.-

    Sonntag, 25. Juli 2010 11:57
  • Und das, obwohl die DLL zum Projekt hinzugefügt wurde und im Projektmappen-Explorer angezeigt wird -.-

    Du musst sicherstellen, dass die DLL im selben Verzeichnis wie die EXE steht! Du musst sie also einfach noch in das Debug/Release Verzeichnis kopieren.


    Jochen Kalmbach (MVP VC++)
    • Als Antwort markiert stes Sonntag, 25. Juli 2010 17:32
    Sonntag, 25. Juli 2010 14:42
  • Vielen vielen Dank, dann lag hier mein Problem.

    Funktioniert nun alles wunderbar, sowohl Lese- als auch Schreibzugriff ;)


    :visit my website: >> www.parallelportprogramming.webs.com <<
    Sonntag, 25. Juli 2010 17:32