Neue Antwort schreiben 
 
Themabewertung:
  • 1 Bewertung(en) - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
LPT1 mit C++ ansteuern?
Basstra Offline
 

Beiträge: 514
Registriert seit: Mar 2013
Beitrag #1
LPT1 mit C++ ansteuern?
Hallo zusammen, ich möchte ein Lauflicht basteln, an die 8 Ports des LPTs kommt je eine LED, leider tut mein Programm nicht so wirklich... Vielleicht kann mir ja einer von euch weiter helfen :)

Code:
#import <stdio.h>
int main (void) {
    FILE *drucker;
    unsigned char byte = 0x01;
    drucker = fopen ("LPT1", "w");
    if (drucker != NULL) {
           printf("tut");
     // time_t     now = time(0); // später kommt ne ordentliche Zeitsteuerung!
          fwrite (&byte, 1, sizeof (unsigned char), drucker);
          int vor = 0;
          int zur = 0;
          while (true) {
              for (vor=0; vor <= 7; vor++) {
                  byte = byte << 1; // Alle Bits um eine Position nach links verschieben
              }
              for (zur=0; zur <= 7; zur++) {
                  byte = byte >> 1; // Alle Bits werden wieder um eine Position nach rechts verschoben
              }
          }
          fclose (drucker);
    } else {
          
           printf("Konnte drucker nicht anlegen");
           getchar();      
    }

}


Also er geht in die Schleife rein.. mehr aber auch nicht

Für Tipps bin ich echt dankbar :)

25.04.2013 21:18
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Fuexline Offline
Euer Gott und Mittelpunkt

Beiträge: 6.574
Registriert seit: Aug 2012
Beitrag #2
RE: LPT1 mit C++ ansteuern?
http://www.tutorials.de/c-c/206404-wie-s...lport.html

sollte helfen

Meine Main Geräte

25.04.2013 21:21
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Basstra Offline
 

Beiträge: 514
Registriert seit: Mar 2013
Beitrag #3
RE: LPT1 mit C++ ansteuern?
Ich gucks mir morgen mal an, danke.

25.04.2013 21:24
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Chrisse Offline
Generischer Benutzertitel

Beiträge: 2.937
Registriert seit: Jul 2008
Beitrag #4
RE: LPT1 mit C++ ansteuern?
(25.04.2013 21:18)Basstra schrieb:  Also er geht in die Schleife rein.. mehr aber auch nicht

Welche, die for oder die while? Kann dein Problem nicht reproduzieren, wenn ich
if (drucker != NULL) durch if(true) ersetze (hab kein LTP Port hier), tuts dass was man erwarten würde.

„Zitate von sich selbst in der Signatur sind doof.“ Chrisse, 2009
„Hmm... mal was aus 2010 reinnehmen“ Chrisse, 2010
„Ach, wie die Zeit vergeht...“ Chrisse, 2011
„Bin immernoch dagegen“ Chrisse, 2012
„Jetzt auch mit 2013“ Chrisse, 2013
„2021 ich komme“ Chrisse, 2014
„Ab jetzt wieder länger“ Chrisse, 2015
„Gut Ding will Weile haben“ Chrisse, 2016
„Meine Signatur: Öfter geupdated als mein Windows“ Chrisse, 2017
„Klicken sie weiter, hier gibt es nichts zu lesen“ Chrisse, 2018
„Dieser Post kann Spuren von Sarkasmus enthalten“ Chrisse, 2019
„Reinstate Chiaki“ Chrisse, 2020
„2021 ist eine Coverstory der Moderation und nie passiert!“, Chrisse, 2022
25.04.2013 21:31
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.951
Registriert seit: Jul 2008
Beitrag #5
RE: LPT1 mit C++ ansteuern?
Woher hast du den Code? Du wirst damit nicht erreichen können was du willst.

Mit fopen("LPT1", "w") macht nämlich das Betriebssystem die Ansteuerung der Pins, in dem es ein Byteprotokoll fährt, was abhängig von den Daten alle möglichen Pins setzt und liest; und auch erwartet da auch dass der Drucker Befehle ordentlich bestätigt. Im schlimmsten Fall ist hinter dem Port "LPT1" gar kein Parallelport-Drucker angeschlossen, sondern irgend ein virtueller Drucker der gar nicht erst Pins hat.

In deinem Fall hast du ja aber keinen Drucker angeschlossen, sondern eine eigene Schaltung ohne Logik. Das heisst du musst die Pin auch selber setzen, und das geht dann nicht mit einem Byteprotokoll, sondern auf PCs klassischerweise mit den INP/OUT Befehlen.

Lass dich von folgendem Text nicht abschrecken, klingt und sieht alles furchtbar kompliziert aus, das hier ist eher eine grobe Zusammenfassung; ich erkläre aber gerne alles nochmals im Detail:

(Dieser Beitrag wurde zuletzt bearbeitet: 27.04.2013 10:48 von gandro.)
25.04.2013 22:20
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Basstra Offline
 

Beiträge: 514
Registriert seit: Mar 2013
Beitrag #6
RE: LPT1 mit C++ ansteuern?
(25.04.2013 21:31)Chrisse schrieb:  
(25.04.2013 21:18)Basstra schrieb:  Also er geht in die Schleife rein.. mehr aber auch nicht

Welche, die for oder die while? Kann dein Problem nicht reproduzieren, wenn ich
if (drucker != NULL) durch if(true) ersetze (hab kein LTP Port hier), tuts dass was man erwarten würde.

Sorry, mein Fehler! das if (drucker != NULL) meine ich, da geht er rein!


(25.04.2013 22:20)gandro schrieb:  Woher hast du den Code? Du wirst damit nicht erreichen können was du willst.

Von meinem programmieren Lehrer.......



Danke für die Hilfe, ich werde es nun mal eben testen und mich danach melden!

26.04.2013 18:11
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Basstra Offline
 

Beiträge: 514
Registriert seit: Mar 2013
Beitrag #7
RE: LPT1 mit C++ ansteuern?
ich habe es nun versucht, bin aber irgendwie gescheitert, keine ahnung.
Ich hab dieses Treiber "installiert", habe auch die header file included:

Code:
#import "inpout32.h"

Bekomme aber folgende Fehler:




Ich bin der totale c/c++ Noob und habe wirklich absolut keinen Plan was ich tun soll.

26.04.2013 19:56
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.951
Registriert seit: Jul 2008
Beitrag #8
RE: LPT1 mit C++ ansteuern?
Ich kenn mich mit dem Linkern unter Windows und C++ nicht aus. Generell gehen aber die meisten Codebeispiele die ich gefunden habe davon aus, dass man die DLL händisch nachlädt. Hier C-Code von der Treibseite, stelle sicher dass die Datei inpout32.dll im gleichen Verzeichnis liegt, wie die Exe deines komplierten Codes.

Hab mich beim obigen Beispiel übrigens vertippt, der Befehl müsste Out32 bzw. Inp32 lauten.

Code:
#include <stdio.h>
#include <conio.h>
#include <windows.h>


/* Definitions in the build of inpout32.dll are:            */
/*   short _stdcall Inp32(short PortAddress);               */
/*   void _stdcall Out32(short PortAddress, short data);    */

/* prototype (function typedef) for DLL function Inp32: */

     typedef short (_stdcall *inpfuncPtr)(short portaddr);
     typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum);

     inpfuncPtr inp32fp;
     oupfuncPtr oup32fp;


/* Wrapper functions for the function pointers
    - call these functions to perform I/O.
*/
     short  Inp32 (short portaddr)
     {
          return (inp32fp)(portaddr);
     }

     void  Out32 (short portaddr, short datum)
     {
          (oup32fp)(portaddr,datum);
     }

int main(void)
{
     HINSTANCE hLib;

     short x;
     int i;


     /* Load the library */
     hLib = LoadLibrary("inpout32.dll");

     if (hLib == NULL) {
          fprintf(stderr,"LoadLibrary Failed.\n");
          return -1;
     }

     /* get the address of the function */

     inp32fp = (inpfuncPtr) GetProcAddress(hLib, "Inp32");

     if (inp32fp == NULL) {
          fprintf(stderr,"GetProcAddress for Inp32 Failed.\n");
          return -1;
     }


     oup32fp = (oupfuncPtr) GetProcAddress(hLib, "Out32");

     if (oup32fp == NULL) {
          fprintf(stderr,"GetProcAddress for Oup32 Failed.\n");
          return -1;
     }


     ////////////////// Hier nun dein Code //////////////////////

     short base = 0x378; // Base-Adresse
     char byte = 1 << 3; // schreibt die Eins von der 1. Stelle 3x nach rechts, so dass sie an 4. Stelle steht
     Out32(base, byte); // setzt Pin Nr. 5 (D3) auf 1, alle anderen auf 0
    

}
(Dieser Beitrag wurde zuletzt bearbeitet: 26.04.2013 20:19 von gandro.)
26.04.2013 20:17
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Basstra Offline
 

Beiträge: 514
Registriert seit: Mar 2013
Beitrag #9
RE: LPT1 mit C++ ansteuern?
So ich habe es nun mal so getestet, ich habe auch die DLL Datei in das Verzeichnis kopiert, und die andere Datei (so wie es in der Anleitung steht) nach system32/drivers kopiert!

Diesen Fehler gibt er nicht aus, also scheint er die Library laden zu können:

Code:
if (hLib == NULL) {
          fprintf(stderr,"LoadLibrary Failed.\n");
          return -1;
     }

Ich habe zum testen einfach mal deinen Beispielcode benutzt, er kommt auch bis dahin, denn ich habe zum testen noch was hinzugefügt:

Code:
////////////////// Hier nun dein Code //////////////////////

     short base = 0x378; // Base-Adresse
     char byte = 1 << 3; // schreibt die Eins von der 1. Stelle 3x nach rechts, so dass sie an 4. Stelle steht
     Out32(base, byte); // setzt Pin Nr. 5 (D3) auf 1, alle anderen auf 0
     printf("test");
     getchar();

Das test gibt er auch aus! :)

Aber es scheinen alle pins auf high stehen zu bleiben, ich habe testweise 2 leds angeschlossen und beide bleiben an..

27.04.2013 10:38
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.951
Registriert seit: Jul 2008
Beitrag #10
RE: LPT1 mit C++ ansteuern?
Okay.. ich kenn mich wie gesagt unter Windows da nicht sonderlich aus, hab das zuletzt mit DOS und später mit Linux gemacht.

Da er den Treiber grundsätzlich zu laden scheint wären die nächsten Schritte mal rauszufinden was denn die wirkliche Basis-I/O-Adresse deines Paralleports ist. Das Interweb schlägt vor, man solle das im Gerätemanager nachschlagen:

[Bild: lpt-portadresse.jpg]

Meiner Meinung müsst da bei deinem Parallelport im eingekreisten sowas stehen wie 0378 oder 0278.. das ist deine Basis-Addresse, die du für short base = 0x0278 verwenden musst in deinem Code (hier jetzt für den Fall dass da 0278 steht, die führende Null wäre egal). An welchen Pins hast du die LEDs denn angeschlossen?

[Bild: 433px-Parallel_port_pinouts.svg.png]
(Dieser Beitrag wurde zuletzt bearbeitet: 27.04.2013 10:58 von gandro.)
27.04.2013 10:58
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste