achim13
Goto Top

LPT mit C Programm ansteuern

Hallo,
ich habe ein c++ Programm geschrieben, leider zeigt es mir Fehler, kann mir jemand helfen. Ich bin ein neuling in diesem Thema!!!!!
Das Programm soll an LPT (0x378h) ein Clock senden und den Port 0x379h auslesen (da sollten Spannungswerte sein). Wie ich schon vorhier geschrieben habe das ist mein erstes c Programm. Ich weiss es nicht wie mann Input / Output in c schreibt welche dll oder... und bei der Definition von Funktionen zeigt der Compailer auch Fehler, bin sehr dankbar für jeder Hilfe. Unten die Quellcode:
#include <ctime>
#include <stdio.h>
#include <string.h>
#include <io.h>
#include <conio.h>
#include <dos.h>
#include <unistd.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include <iostream>
---------------------------------------------------------------------------
#define LPT1 0x378
Data Register (Base + 0h) Ausgang
#define LPT2 0x379 //Status Register (Base + 1h) Eingang
#define oo 4
using namespace std;
int StatusPort1=0;
int StatusPort2=0;
int anzeige_spannung_array[100];
int anzeige_zeit_array[100];
int i=0;
int i1=0;
int i2=0;
float bit2;
int bit1;
int t1;
int main (int argc, const char *argv)
{
StatusPort1=(LPT1);
StatusPort2=(LPT2);
cout<<"LPT1 - Ausgang = "<<StatusPort1;
cout<<endl;
cout<<"LPT2 - Eingang = "<<StatusPort2;
Sleep(10000);
function_SpannungLesen(void)
{
For(i1=0; i1<1000; i1++)
{
function_ClockSenden(void)
{
For(i2=0; i2<7; i2++)
{
bit2==1;
output(LPT1, bit1);
bit2==0;
output(LPT1, bit1);
}
}
}
input(LPT2, bit2);
t1 = (clock()/CLOCKS_PER_SEC);
anzeige_spannung_array[i]=bit2;
anzeige_zeit_array[i]=t1;
i=i+1;
if i=99 goto Ausgabe
}
Ausgabe:
function_Ausgabe(void)
{
For(i1=0; i1<25; i1++)
{i=0;
bit2=anzeige_spannung_array[i];
bit1=anzeige_zeit_array[i];
cout<<"Spannung = "<<bit2<<" um "bit1<<" ";
i=i+1
bit2=anzeige_spannung_array[i];
bit1=anzeige_zeit_array[i];
cout<<"Spannung = "<<bit2<<" um "bit1<<" ";
i=i+1
bit2=anzeige_spannung_array[i];
bit1=anzeige_zeit_array[i];
cout<<"Spannung = "<<bit2<<" um "bit1<<" ";
i=i+1
bit2=anzeige_spannung_array[i];
bit1=anzeige_zeit_array[i];
cout<<"Spannung = "<<bit2<<" um "bit1<<" ";
cout<<endl;
}
Return 0;
}

Gruß Achim

Content-ID: 135486

Url: https://administrator.de/contentid/135486

Ausgedruckt am: 12.11.2024 um 22:11 Uhr

StefanKittel
StefanKittel 08.02.2010 um 23:44:40 Uhr
Goto Top
Hallo,
der direkte Zugriff auf "Legacy" Hardware unter Windows ist tricky. Ich glaube Du must unter Win7 sogar einen Treiber dafür schreiben.
Warum machst Du es Dir nicht viel einfacher und verwendest einen GamePort? Den gibts als USB für 5 Euro und läßt sich über einen Joystick sehr einfach programmieren.
Stefan
Arano
Arano 09.02.2010 um 00:44:43 Uhr
Goto Top
Hm... kann ich helfen oder kann ich es nicht !?

Muss schon sagen das mich die Fragestellung und die Antwort von StefanKittel etwas überfordern - ist halt nicht mein Bereich .-)
ABER ich habe mir mal eine C++ Progrämmchen zusammengeschrieben mit dem ich die Pins des LPT setzen und lesen konnte, vielleicht hilft dir das ja schon.
Wichtig dabei war eine zusätzliche inpout32.dll die vorher ins System kopiert wurde um über diese den Zugriff auf den LPT zu ermöglichen.

Die "inpout32.dll" wurde mit gelinkt.
Dann die Prototypen und Initialisierung:
/** windows **/
/* lade inpout32.dll fuer LPT port zugriff unter win xp */

/* prototype (function typedef) for DLL function Inp32: */
typedef short _stdcall (*inpfuncPtr)(short portaddr);
typedef void  _stdcall (*oupfuncPtr)(short portaddr, short datum);

HINSTANCE  hLib;
inpfuncPtr inp32;
oupfuncPtr oup32;

      // lade inpout.dll
      hLib = LoadLibrary("inpout32.dll");  
      if(hLib==NULL)
      {
            cout<<"Load inpout32.dll failed !\n";  
      }

      /* get the address of the function Inp32 */
      inp32 = (inpfuncPtr)GetProcAddress(hLib,"Inp32");  
      if(inp32==NULL)
      {
            cout<<"GetProcAddress for Inp32 Failed !\n";  
      }

      /* get the address of the function Outp32 */
      oup32 = (oupfuncPtr)GetProcAddress(hLib,"Out32");  
      if(oup32==NULL)
      {
            cout<<"GetProcAddress for Oup32 Failed !\n";  
      }
Sowie das Blinken lassen einer LED:
/** windows **/
/* lasse die LED am LPT mehrfach blinken */

void lptFlash()
{
      // aktuellen status auslesen um ihn am ende wiederherstellen zu koennen
      int status = (inp32)(LPT_PORT);
      // blinken
      for(int x=1; x<=10; x++)
      {
            (oup32)(LPT_PORT,LPT_ON);
            Sleep(LED_FLASH_ON);
            (oup32)(LPT_PORT,LPT_OFF);
            Sleep(LED_FLASH_OFF);
      }
      // alten status wiederherstellen
      (oup32)(LPT_PORT,status);
}
Achja, und die verwendeten Konstanten:
#define LPT_PORT      0x378         {{comment_single_line_double_slash:0}}
#define LPT_ON        0xFF          {{comment_single_line_double_slash:1}}
#define LPT_OFF       0x00          {{comment_single_line_double_slash:2}}
#define LED_FLASH_ON  50            {{comment_single_line_double_slash:3}}
#define LED_FLASH_OFF 70            {{comment_single_line_double_slash:4}}

So, jetzt nur noch hoffen das das überhaupt für dich nützlich ist *g*
Ggf. kann ich auch alles einmal Packen zur Verfügung stellen falls tatsächlich benötig...

Gute Nacht
~Arano
StefanKittel
StefanKittel 09.02.2010 um 00:52:04 Uhr
Goto Top
hier http://forums.highrez.co.uk/viewforum.php?f=7 gibts das Forum dazu. Man muss tricksen um es unter Vista und Windows zum laufen zu bekommen.