LPT unter Windows steuern (VB)

ähnliches wurde unten schon mal gefragt (und noch nicht beantwortet):

Wie kann ich unter VisualBasic im Windows98-Betrieb (NT ist nicht nötig) die 8 einzelnen Datenleitungen des parallelen Ports ansteuern?

Quasi so:

Sub Line1(stat As Integer)
If stat=1 Then
’ + 5 Volt (?) auf Data0 legen
Else If stat=0 Then
’ keine Spannung anlegen
Else
’ …
End If
End Sub

Hallo Tino !

In C++ oeffnet man den LPT oder die Serielle Schnittstelle wie eine Datei mit OpenFile. Anstatt des Dateinamens uebergibt man z.B. „LPT1“, „COM2“ usw. Mit ReadFile und WriteFile liest und schreibt man auf den Port. Da diese Funktionen alles API Funktionen sind muessten die in VB genauso benutzt werden koennen. Du musst bloss noch schauen in welcher DLL die stehen und die Prototypen dann mit declare in VB vereinbaren. Wenn Du eine bestimmte Belegung auf den Datenleitungen haben willst, musst Du die Belegung in die passende Zahl umrechnen und mit WriteFile schreiben. Beim Com- Port funktionieren die Funktionen einwandfrei. Schau noch mal in der MSDN-Hilfe auf der Microweich - Seite.
Wenn das nicht klappt, kannst Du mir ja eine Mail schicken.

Tschuess !

Andreas

Leider habe ich keine Ahnung von VB, aber irgendwie wird man sicher, wie in anderen Programmiersprachen auch, Inline-Assembler verwenden können. Dann funktioniert das unter Win9x (aber nicht unter NT!) über den Assembler-Befehl IN (Systax müßte so ähnlich aussehen:smile:

MOV DX, 379h
IN AL, DX

evt. müssen AL und DX im IN-Befehl vertauscht werden. Anstelle von 379h gibst du die Adresse deines Druckerports+1 ein, da Du so an die Statusregister herankommst.
Anschließend hast Du in AL ein Byte, bei dem jedes Bit einer Portleitung entspricht.
Falls Du über den IN-Befehl und die Belegung der Statusregister kein Material hast, schreib mir eine Mail, ich werde dann nachsehen, habe aber im Moment sehr wenig Zeit…

Viele Grüße
Gunther

Leider verlesen…
Leider habe ich mich eben in Deinem Artikel verlesen…
Die AUSGABE über den seriellen Port geht über Out:

MOV DX, 378h ;deine Druckerportadresse (ohne +1)
MOV AL, Datenbyte
OUT DX, AL (oder DX und AL vertauscht? Mußt Du ausprobieren)

Viele Grüße
Gunther

Hi,

mit z.B. C kann man sowas wie einen Outport Befehl nutzen der direkt in eine Speicheradresse schreibt.
Der Druckeranschluss hat meistens die Adresse 378 hex, die ist aber auch in der Systemsteuerung zu finden.
Je nach gewünschtem Bitmuster musst Du einen wert: 0…255 (alle Leitungen gesetzt) rausschreiben:

z.B.:

outp(adresse,wert)

Hallo !

Von einem Versuch der direkten Hardwareprogrammierung unter Windows moechte ich dringend abraten. Zwar gibt es Dank der Inkonsequenz von Microweich unter 95 und 98 ? noch die Moeglichkeit Portzugriffe zu machen, das duerfte sich unter 2000 jedoch engueltig erledigt haben. Bei solchen Zugriffen geht jedes Timing im Multitasking verloren (spielt bei dieser Anwendung ev. keine Rolle. Beim Empfang von Daten ueber die serielle Schnittstelle aber schon). Sauber sind Zugriffe ueber die entsprechenden Treiber. Die passenden API- Funktionen haben ich ja weiter unten erlaeutert. Der Zugriff ist genauso einfach wie outp() und ausserdem auch unter NT und 2000 moeglich. Da es sich um eine API- Funktion handelt, kann der Zugriff von allen moeglichen Sprachen auch ohne outp-Befehl gemacht werden (Hab ich schon von 'nem EXCEL Macro aus gemacht).
Solls mal anstatt der parallelen Schittstelle die serielle sein funktionierts wie gesagt genauso und man braucht sich um keine Puffer- und Timingsachen zu kuemmern, da das die Treiberebene erledigt. Direkte Hardwarezugriffe gehoeren meiner Meinung nach bei jedem Multitasking-System in die Treiber-Ebene und nicht in die Anwendung. Ein System was solche Zugriffe zulaesst ist kein richtiges Multitasking- Betriebssystem (Win95), weil es seine Hardware nicht vollkommen beherrscht.

Tschuess !

Andreas

Da habe ich nichts passendes gefunden… die sind aber auch (wie alle Microsoft-Seiten) etwas umständlich aufgebaut.
Ich brauche einfach nur eine Prozedur, mit der ich die Daten-Leitungen des LPTs an oder aus schalten kann. Unter Pascal habe ich es damals (ist schon 5 Jahre her) mit den Assembler-Sache gemacht - aber wie Du schon gesagt hast, ist dies unter Windows (besonders NT und 2000) nicht so ohne weiteres möglich (bzw. gar nicht).

Wie genau mache ich das mit den API-Befehlen?

Es gab eine Bibliothek, die INPs und OUTs simulierte, ich habe nach INPOUT gesucht und folgendes gefunden:
ftp://ftp.armory.com/pub/user/rstevew/LPT/inpout.doc
(eine Textdatei)
bzw inpout.zip, inpout16.zip, inpout32.zip.
Ich hoffe, das ist es…

Gruß

J.

Hallo !

Bei den Bezeichnungen der API- Funktionen hab ich mich ein bisschen verschrieben.
So muesste es in C aussehen.

#include 
void main(void)
{
unsigned char byte;
DWORD written;
HANDLE hPort;
int i;
 hPort=CreateFile("LPT1",GENERIC\_READ|GENERIC\_WRITE,0,0,OPEN\_EXISTING,0,0);
 byte=0xFF;
 for (i=0;i

Hier schreibe ich den Wert 255 (alle Leitungen gesetzt 1000 mal auf die Schnittstelle. Leider habe ich gerade keinen Schnittstellenpruefer da, um mir das ganze mal anzuschauen. Ob man das in einer Schleife machen muss, wenn die Werte am Ausgang stehen bleiben sollen kann ich Dir so garnicht sagen.
Jetzt musst Du Dir die ganzen API-Funktionen in VB verfuegbar machen. Dazu musst Du Dir die passenden Deklarationen fuer die Funktionen und die Konstanten schreiben. Da gibts ein Tool namens API-Textviewer dafuer. Ich hab die mal die Declaration fuer CreateFile gemacht.



    
    Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY\_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long




Wenn Du Dir das Tool nicht besorgen kannst, mach ich Dir die paar Deklarationen. Das waere dann aber per E-Mail am Besten zu erledigen.

Tschuess !

Andreas