# Wie sprche ich mit c++ Parallelport an?



## Geraldimus (25. Mai 2005)

Hallo!
Wie spreche ich mit c++ den Parallelport an, um eventuell Relais zu schalten?
Ein nettes Programm mit erklärung für jemanden, der nicht viel Ahnung hat wäre echt cool. Das bekomme ich irgendwie nicht hin. Habe schon unendlich Bücher durchsucht. Ich verzweifle schon.

MFG

Gerald


----------



## Tobias K. (25. Mai 2005)

moin


Dann benutz doch mal die Suchfunktion das Boards!
Das Thema gab es hier schon 100 mal!
Warum soll dir jemand ein Programm mit Erklärung schreiben, wenn du nichtmal Lust hast die Suchfunktion zu benutzen.


mfg
umbrasaxum


----------



## Geraldimus (25. Mai 2005)

Habe aber nichts passendes für mich gefunden.


----------



## Tobias K. (25. Mai 2005)

moin


Etwas passendes kann dir auch keiner geben wenn du nciht angibst welchen Compiler du benutzt und, welches Betriebssystem.
Guck dir z.B. mal folgenden Thread an: http://www.tutorials.de/tutorials185656.html&highlight=lpt


mfg
umbrasaxum


----------



## Geraldimus (25. Mai 2005)

Also ich habe Microsoft Visual 6.0. Möchte mit c++ schreiben. Betriebssystem XP. Sollte aber auch auf 2000 laufen.


----------



## Tobias K. (25. Mai 2005)

moin


Ok, nu guck dir mal den Thread an, zu dem ich den Link erstellt hab. Da ist ein komplettes Beispielprogramm bei!

Und schliesse übrigens keinesfalls direkt ein Relais an den Parallel Port an!


mfg
umbrasaxum


----------



## Geraldimus (25. Mai 2005)

Ist das das richtige? Kann aber mit den Befehlen nicht soviel anfangen. Bin doch Anfänger.


----------



## Geraldimus (25. Mai 2005)

#include <stdio.h>
#include <windows.h>
#include <time.h>
//-------------------------------------------------------------------------
typedef short _stdcall (*inpfuncPtr)(short portaddr);
typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);

void lib_laden();
void pin(int Pin);
void lib_schliessen();

HINSTANCE hLib;
inpfuncPtr inp32;
oupfuncPtr oup32;
short x;
int i = 0x378;
//-------------------------------------------------------------------------
void lib_laden ()
{
hLib = LoadLibrary("inpout32.dll");
inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
if (hLib == NULL || inp32 == NULL || oup32 == NULL)  {/*** ERROR ***/}
}
void pin(int Pin)
{
  switch (Pin)
  {
  case 0: (oup32)(i,0x0); break;
  case 1: (oup32)(i,0x1); break;
  case 2: (oup32)(i,0x2); break;
  case 3: (oup32)(i,0x4); break;
  case 4: (oup32)(i,0x8); break;
  case 5: (oup32)(i,0x10); break;
  case 6: (oup32)(i,0x20); break;
  case 7: (oup32)(i,0x40); break;
  case 8: (oup32)(i,0x80); break;
  }
}
void lib_schliessen()
{
FreeLibrary(hLib);
}


----------



## Tobias K. (25. Mai 2005)

moin


Dann suchst du jetzt zu jedem Funktionsnamen eine Erklärung im Internet.
Wenn du das ncht kannst ist es noch zu früh und du solltest erstmal mehr Grundlagen lernen

Oder kurz:
Es werden die Funktionen inp32 und oup32 aus der inpout32.dll geladen.
Dann wird oup32 ein bestimmter Wert übergeben der jeweils für nen bestimmten Pin steht. oup32 gibt dann ein Signal auf den Pin zu dem der Wert passt.


mfg
umbrasaxum


----------



## Geraldimus (25. Mai 2005)

Leider hab ich nicht so viel Zeit. Habe ein Projekt von meiner Info-Professorin aufgedrückt bekommen. Dabei studiere ich Wirtschaftsingenieur.  
Ist schon etwas gemein. Hab dieses Programm mal kompiliert und 5 Fehler.
<windows.h> kenne ich z.B. nicht. Das einzige, was ich kenne ist <iostream.h> <math.h>
Die Vorlesungen kann man auch vergessen. Klassen kann kaum jemand von uns. Was kann ich da machen? Habe schon das Buch c++ for Dummies. Aber als ich das gelesen habe, habe ich gedacht ich bin ein Ultra-Dummi.


----------



## Tobias K. (25. Mai 2005)

moin


Ok, solange ich meine netten 5 Minuten hab hier mal eine ausführliche Erklärung.


```
#include <stdio.h>
#include <windows.h>
#include <time.h>
```
time.h enthällt Funktionen zur Zeiterfassung...
windows.h Enthällt ne Menge Funktionen der WinApi, das sind Funktionen um mit Windows und des Funktionen arbeiten zu können.
stdio.h ist für Ein und Ausgaben.


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

void lib_laden();
void pin(int Pin);
void lib_schliessen();

HINSTANCE hLib;
inpfuncPtr inp32;
oupfuncPtr oup32;
short x;
int i = 0x378;
//-------------------------------------------------------------------------
void lib_laden ()
{
hLib = LoadLibrary("inpout32.dll");
inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
if (hLib == NULL || inp32 == NULL || oup32 == NULL) {/*** ERROR ***/}
}
```
Hier werden die Funktionen aus der DLL geladen, das muss dich weiter nciht interessieren, du kannst es so übernehmen. int i = 0x378; ist die übliche Adresse des Druckerports, sie weicht manchmal leicht ab, man kann in der Systemsteuerung gucken welche Adresse es ist.


```
void pin(int Pin)
{
switch (Pin)
{
case 0: (oup32)(i,0x0); break;
case 1: (oup32)(i,0x1); break;
case 2: (oup32)(i,0x2); break;
case 3: (oup32)(i,0x4); break;
case 4: (oup32)(i,0x8); break;
case 5: (oup32)(i,0x10); break;
case 6: (oup32)(i,0x20); break;
case 7: (oup32)(i,0x40); break;
case 8: (oup32)(i,0x80); break;
}
}
```
Du Funktion bekommt eine Pinnummer übergeben und gibt ein Signal auf den Pin.


```
void lib_schliessen()
{
FreeLibrary(hLib);
}
```

Schliesst die Dll.


mfg
umbrasaxum


----------



## Tobias K. (25. Mai 2005)

moin


Mal ein Beispiel wie du das anwenden kannst.

```
int main()
{
    int pin = 0;

    lib_laden();
    lib_schliessen();

    printf("Welcher Pin soll aktiviert werden? ");
    scanf("%d", &pin);

    pin(pin);

    return 0;
}
```


mfg
umbrasaxum


----------



## Geraldimus (25. Mai 2005)

Danke. Das hilft mir jetzt echt weiter. Nach dem Essen werde ich mal rumexperimentieren.


----------



## b-r-you-know (26. Juli 2007)

Tolle Erklärung,

Jedoch, bei deinem Test Programm ist dir ein kleiner Fehler unterlaufen (kommt mir so vor).

Zumindest is dann bei mir ein Fehler aufgetreten.

Du Schließt die DLL noch vor setzen des PIN's dadurch kennt er den Befehl OUT32 nicht mehr und man erhält als Fehlermeldung ACCESS VIOLATION

Lösung:

Einfach das schließen der DLL ganz am Ende aufrufen.


----------

