B.Kainka/H.J.Berndt, PC-Schnittstellen unter Windows, Elektor-Verlag 1999


FAQ

  • Frage: Warum sind Funktionen in PORTS.BAS als Integer deklariert, obwohl sie nur Bytes zurückliefern?
  • 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.

  • Frage: Wie kann man die DLL in C++ verwenden?
  • 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

  • Frage: Wo bekommt man den Portbaustein 8243?
  • Antwort: Es gibt nur noch den CMOS-Typ 82C43. Das IC ist z.B. bei www.reichelt.de zu bekommen.

    Updates


    AD-Wandler in VB

    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)


    Lesen vom Parallelport

    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.


    Die PORT.DLL unter Windows XP

    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)



    Ansteuerung der PortDLL aus C#/dotNET, von Sascha Bader

    Das Beispiel erleichtert die ersten Schritte mit C#/dot.NET. Das Visual Studio Projekt für die Ansteuerung der PortDLL aus C# heraus beeinhaltet einen experimentellen Frequenzgenerator, der  bis zu 25 kHz schafft.

    Download: PortDLLDemo_V1.0.zip (88 KB)

    oder auf der Homepage von Sascha Bader:

    http://www.sascha-bader.de/html/portdlldemo.html