B.Kainka/H.J.Berndt, PC-Schnittstellen unter Windows, Elektor-Verlag 1999
Antwort: Es klappt. Hier findet man mehr zu Windows NT4.
Antwort: Hier: Compact.Zip (229 K)
Antwort: Leider wurde TXD in einigen Dateien vergessen, aber nicht immer. Zum Beispiel im Verzeichnis Kap9/VB5 findet sich die Datei PORTS.BAS mit Datum vom 29.12.98. Darin ist TXD korrekt eingetragen. Man kann aber auch Bedarf einfach die folgende Zeile hinzufügen:
Declare Sub TXD Lib "Port" (ByVal b%)
Antwort: In VB5 gibt es den Typ Byte nicht. Man kann aber immer einem Integer ein Byte zuweisen. Ab VP6 gibt es auch den Typ Byte. Man kann trotzdem weiterhin genauso gut mit Integer arbeiten.
Antwort: Auf der Homepage von Hans-Joachim Berndt gibt es ein Beispiel für die Deklaration der RSAPI.DLL in C++. Mit der PORT.DLL geht es genauso. http://www.hjberndt.de/book/msrfaq.html#4
Antwort: Es gibt nur noch den CMOS-Typ 82C43. Das IC ist z.B. bei www.reichelt.de zu bekommen.
Markus Nakielski hat das Delphi-Programm zum AD-Wandler TLC549 aus Kap. 7.3 in VB umgeschrieben. Hier ist der Quelltext:
Private Sub Command1_Click()
CLOSECOM
End
End Sub
Private Sub Form_Load()
i = OPENCOM("COM1:9600,N,8,1")
If i = 0 Then MsgBox ("Schnittstelle nicht verfügbar!")
Timer1.Interval = 100
Timer1.Enabled = True
End Sub
Public Function ad() As Byte
Dim n As Integer
Dim Stelle As Integer
Dim Wert As Byte
Beginn:
RTS 1
DELAYUS (10)
RTS 0
Wert = 0
Stelle = 128
For n = 1 To 8
If DSR() = 1 Then Wert = Wert + Stelle
DTR 1
DELAYUS (10)
DTR 0
Stelle = Stelle / 2
Next n
ad = Wert
End Function
Private Sub Form_Unload(Cancel As Integer)
CLOSECOM
End Sub
Private Sub Timer1_Timer()
Dim Spannung As Double
Spannung = ad / 255 * 5
Text1.Text = Str$(Spannung) + " V"
End Sub
Probleme mit dem Windows-Timer
Olof Oskarsson aus Schweden hat Fehlermeldungen beim Programm Compact-Universal und dem Dephi-Programm Uni1 aus Kapitel 8 beobachtet. Nach einiger Laufzeit kann es zu unregelmäßigen Abstürzen mit einer Fehlermeldung zur Gleitkomma-Operation kommen. Nach längeren Versuchsreihen geriet die Frequenz-Funktion unter Verdacht. Es konnte aber keine einzelne Zeile als Übeltäter entlarvt werden.
Das Problem scheint am Windows-Timer zu liegen. Da die Frequenz-Funktion eine längere Zeit in Anspruch nimmt, kann folgende Situation eintreten: Die Timerprozedur hat die Frequenz-Funktion aufgerufen. Irgendwelche besonderen Ereignisse fordern nun von Windows Rechenzeit für andere Prozesse. Wenn das alles abgearbeitet ist, ist ein Windows-Timerereignis schon wieder fällig, obwohl der zuletzt aufgerufene Durchgang der Funktion Frequenz noch nicht beendet ist. Jedenfalls hat folgendes Vorgehen eine deutliche Verbesserung gebracht: Der Windows-Timer wird in der Timer-Prozedur am Anfang gesperrt und am Ende erst wieder freigegeben.
procedure TForm1.Timer1Timer(Sender: TObject);
var Wert: Word;
Spannung: Real;
begin
Timer1.Enabled := false;
Dout := 0;
if CheckBox1.Checked Then Dout := Dout +1;
.....
Austausch;
CheckBox9.Checked := ((Din And 1) >0);
.....
Edit1.Text := FloatToStrF(Spannung,ffGeneral,3,2) + ' V';
Edit2.Text := FloatToStrF(Frequenz*10,ffGeneral,4,0) + ' Hz';
Timer1.Enabled := true;
end;
Die entscheidende Veränderung in Listing 8.1
Die selbe Änderung könnte bei allen anderen Programmen ebenfalls sinnvoll sein, die die Frequenz messen.
PORT.DLL in C++ und Java verwenden
Dr. Olaf Hochmuth vom Institut für Informatik an der Humboldt-Universität in Berlin (siehe auch: http://www.informatik.hu-berlin.de/~hochmuth/waage.htm) schickte mir eine überarbeitete Version der Referenz (referenz.txt) zur PORT.DLL. Es wurden einige Tippfehler entfernt und Deklarationen für C++ hinzugefügt. Der C-Teil stammt von Roman Blaschek, HU Berlin.
Neu: In der letzten Fassung werden auch die Deklarationen für Java aufgeführt. Der Java-Teil wurde von C. Werner und R. Blaschek angefügt. Herzlichen Dank!
Neu: Und hier ein Beispiel für die Verwendung der DLL in Java: portdllw.zip (25 K)
Uwe Lorenz schrieb: "Ich wollte über den Parallelport Daten
einlesen. Leider hab ich bis heute keinen Erfolg damit. Das Senden von
Daten "Outport (Addr, B)" funktioniert tadelos, das Einlesen
"Inport (Addr, B)" bringt mir jedoch immer den letzten Zustand
nach "Outport (Addr,B)" zurück. Das gleiche Verhalten bekomme
ich auch mit Ihrem Programmbeispiel 9.2 für VB. Mein Rechner ist ein
Compaq Presario mit Win ME '4.90.3000' und im BIOS ist ECP+EPP konfiguriert.
Auch in der Systemsteuerung kann mat ECP-Druckeranschluß LPT1 nachlesen,
Adr. H378.
...habe das Problem gelöst. Ich mußte im BIOS des Rechner statt
ECP+EPP nur EPP1.7 angeben, dann funktionierte es. Bei ECP+EPP sowie nur
ECP kann man nicht vom Port LPT lesen....ging nicht.
Das Buch ist auch für Windows XP einsetzbar. Direkte Portzugriffe sind natürlich wie schon unter Windows 2000 verboten. Aber die Zugriffe auf die RS232 und andere Schnittstellen laufen über die Windows-API und sind unter XP unverändert. Im Bereich der Soundkarte gab es einen Bug, der sich erst unter XP auswirkte. Außerdem wurden vereinzelt Probleme mit der RS232 beobachtet. Beide Probleme sind mit dem Update der Port.DLL gelöst.
Download der Port.DLL (port.zip, 27 kB)