LPT-Port über Visual C++

Hallo zusammen,

ich möchte gerne meinen LPT-Port über Visual C++ ansprechen. Mein Betriebssystem ist Windows 2000. Meine Entwicklersoftware Microsoft Visual Studio.net.
Zum Probieren hab ich mir erst mal eine Schaltung gebastelt, die das Signal aus dem LPT-Port speichert (ein D-FlipFlop) und dadurch bis zu 8 LEDs (die 8 Bit) leuten lässt. Die Schaltung ist also angeschlossen an die 8 Datenbits und das Enable-Bit.
Könnt ihr mir vielleicht helfen, wie ich einzeln die 8 Bit des LPT-Port ansprechen kann? (Zur Info: Ich habe bisher noch nie mit Schnittstellen programmiert.)

Gruß Axel

Hallo zusammen,

ich möchte gerne meinen LPT-Port über Visual C++ ansprechen.
Mein Betriebssystem ist Windows 2000. Meine Entwicklersoftware
Microsoft Visual Studio.net.

Könnt ihr mir vielleicht helfen, wie ich einzeln die 8 Bit des
LPT-Port ansprechen kann? (Zur Info: Ich habe bisher noch nie
mit Schnittstellen programmiert.)

Gruß Axel

Hallo Axel,

man kann die Bits eines 8-Bit-Ports (jedenfalls bei LPT) nicht einzeln ausgeben. Man muss daher den 8-Bit-Wert „im Kopf“ behalten und jedesmal entsprechend ändern und ausgeben (ich schreibe aus gewohnheit Pascal-Notation, weil ich nicht alle entsprechenden C-Befehle im Kopf habe, ist aber für einen Programmierer sicher verständlich):

 { Bit 2 setzen }
LPTByte := LPTByte or 0x04; 
 { Bit 3 zurücksetzen }
LPTByte := LPTByte and not 0x08;
 { an Port ausgeben }
LPTPort := LPTByte;

Mit Assembler geht das eher leichter. Da immer alle 8 Bit ausgegeben werden, ist den Nebenwirkungen grösste Aufmerksamkeit zu widmen.

Gruss Reinhard

Hallo Axel,

ich möchte gerne meinen LPT-Port über Visual C++ ansprechen.
Mein Betriebssystem ist Windows 2000. Meine Entwicklersoftware
Microsoft Visual Studio.net.

Hier ist schon der Hund begraben:

In einem Multitask-Betriebssystem ist es strengstens verboten, dass eine Applikation direkt an der Hardware rumspielt !!
Stell dir mal vor, eine Applikation druckt gerade und deine spielt gerade am Port rum.

Unter den DOS-Windows (W98/ME) geht das noch, aber auf dem NT-Basierten ist es eigeentlich nur einem Treiber erlaubt.

MfG Peter(TOO)

Hallo Peter !

Unter den DOS-Windows (W98/ME) geht das noch, aber auf dem
NT-Basierten ist es eigeentlich nur einem Treiber erlaubt.

Unter NT, 2K und XP geht es ebenso wie unter Linux und anderen Multitasking-Betriebssytemen indem man die Schnittstelle wie eine Datei behandelt.
Also einfach mit CreateFile(„LPT2“, …) öffnen und dann mittels Dateioperationen darauf zugreifen.

mfg
Christof

Hier ist schon der Hund begraben:

In einem Multitask-Betriebssystem ist es strengstens verboten,
dass eine Applikation direkt an der Hardware rumspielt !!
Stell dir mal vor, eine Applikation druckt gerade und deine
spielt gerade am Port rum.

Unter den DOS-Windows (W98/ME) geht das noch, aber auf dem
NT-Basierten ist es eigeentlich nur einem Treiber erlaubt.

MfG Peter(TOO)

Hallo Peter,

grundsätzlich richtig, aber die Uralt-Hardware wird vom System überwacht: ein Port-Output erzeugt einen Trap, und das System greift dann wie gewünscht im privilegierten Modus auf den Port zu.

Ohne diese Krücken würde kaum eine unsauber programmierte DOS-Software laufen, fast jede bessere Anwendung schreibt z.B. direkt in den Video-Speicher, was in ähnlicher Weise vom System abgefangen wird.

Gruss Reinhard

Hallo Christof,

Unter den DOS-Windows (W98/ME) geht das noch, aber auf dem
NT-Basierten ist es eigeentlich nur einem Treiber erlaubt.

Unter NT, 2K und XP geht es ebenso wie unter Linux und anderen
Multitasking-Betriebssytemen indem man die Schnittstelle wie
eine Datei behandelt.
Also einfach mit CreateFile(„LPT2“, …) öffnen und dann
mittels Dateioperationen darauf zugreifen.

Allerdings muss dabei mindestens das Handshake von Drucker noch simuliert werden und je nach Treiber müssen auch die Statusleitungen auf die richtigen Pegel gebracht werden.
Zudem haben diverse Bit-Kombinationen eine spezielle Bedeutung und werden je nach Treiber in ein ganz andere Ausgabe an den Drucker übersetzt.

MfG Peter(TOO)

Hi Reinhard,

mein Problem ist es nicht, die 8-Bit zu setzen…
Da hatte ich schon vor, das mit einer Byte-Variablen machen und dann diese Variable zu verändern und jeweils den geänderten Byte-Wert an den LPT-Port zu schicken.
Aber den Byte-Wert über zu verändern ist ja relativ einfach, weil man in C++ ja auf alle 8 Bits dieses Byte-Wertes einzeln zugreifen kann.
Mein Problem besteht darin, den Byte-Wert (hab mich das letzte Mal wohl ein bißchen undeutlich ausgedrückt :wink: ) an den LPT-Port zu schicken.

Gruß Axel

Hallo Axel,

man kann die Bits eines 8-Bit-Ports (jedenfalls bei LPT) nicht
einzeln ausgeben. Man muss daher den 8-Bit-Wert „im Kopf“
behalten und jedesmal entsprechend ändern und ausgeben (ich
schreibe aus gewohnheit Pascal-Notation, weil ich nicht alle
entsprechenden C-Befehle im Kopf habe, ist aber für einen
Programmierer sicher verständlich):

{ Bit 2 setzen }
LPTByte := LPTByte or 0x04;
{ Bit 3 zurücksetzen }
LPTByte := LPTByte and not 0x08;
{ an Port ausgeben }
LPTPort := LPTByte;

Mit Assembler geht das eher leichter. Da immer alle 8 Bit
ausgegeben werden, ist den Nebenwirkungen grösste
Aufmerksamkeit zu widmen.

Gruss Reinhard

Hallo,

das Handshake vom Drucker könnte ich doch irgendwie simulieren, indem ich das hardwaretechnisch realisiere, oder?
Auch irgendwelche Statusleitungen auf den richtigen Pegel zu bekommen müsste doch gehen.
Nur das mit dem Übersetzen bestimmter Bit-Kombinationen ist wohl ein Problem.

Gruß Axel

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo zusammen,

Könnt ihr mir vielleicht helfen, wie ich einzeln die 8 Bit des

LPT-Port ansprechen kann? (Zur Info: Ich habe bisher noch nie
mit Schnittstellen programmiert.)

Gruß Axel

Hallo Axel,

hier ist wohl alles, was man über das Thema wissen muss:
http://www.epanorama.net/circuits/parallel_output.html

Gruss Reinhard

Hallo Reinhard,

vielen Dank für den Link, dort ist wirklich alles rund ums programmieren mit dem LPT-Port drin. Ich werd mich mal in einer ruhigen Minute (oder besser in mehreren ruhigen Stunden :wink: ) hinsetzen und den Artikel durchlesen und versuchen das Englisch zu verstehen :wink:

Gruß Axel

PS: Vielleicht weiß ja auch jemand noch ne deutsche Seite zu dem Thema :wink: