LPT1 und Inpout32.dll

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Kagurame.

    LPT1 und Inpout32.dll

    Hallo, ich habe ein kleines Problem mit der Inpuout32.dll

    Ich möchte mit meinem PC die Parallele Schnittstelle ansprechen.
    Dies tue ich mit besagter DLL.

    Ich habe ein von einem Freund gebautes Kästschen (er ist Elektriker) mit 8 LED´s (für Ausgänge) und 5 Kippschaltern (Eingänge).

    Schreiben funktioniert wunderbar, dort spreche ich die Adresse 888 an.
    Damit kann ich dann entsprechend die LED´s ein und ausschalten.

    Das Lesen funktioniert nicht ganz.
    Dort spreche ich Adresse 889 an (Siehe Punkt 8.2).

    Sind alle Kippschalter deaktiviert, so erhalte ich den Wert 87 (Bits 0, 1, 2, 4, 6 sind somit logisch aktiviert).

    Schalte ich per Schalter die 4 oder 6, tut sich nichts, schalte ich 3, 5, oder 7 so verändert sich der ausgelesene Wert wie erwartet.

    Somit scheinen mir neben den nicht verfügbaren ersten 3 Bits die Bits 4 und 6 immer aktiv zu sein und Strom zu führen.

    Wir haben die Hardware kontrolliert, dort sieht alles in Ordnung aus, auf einem anderen Testrechner mit einer QBasic-Anwendung funktioniert alles wie es soll, ich bin lediglich dabei, das ganze auch unter VB zum laufen zu bringen.

    Ich habe hier ein paar entsprechende Code-Ausschnitte:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Shared Function Connect(ByVal args() As String) As Integer
    2. If args.Length = 0 OrElse args.Length > 2 Then Return 0
    3. args(0) = args(0).ToLower
    4. Dim value As Integer
    5. If args.Length = 1 AndAlso args(0).Equals("get") Then : Return ReadHardware(HardWareAdress + 1)
    6. ElseIf args.Length = 2 AndAlso args(0).Equals("set") AndAlso
    7. (New Regex("[0-9]")).IsMatch(args(1)) Then
    8. value = CInt(args(1))
    9. If value >= 0 Then
    10. If value < 256 Then
    11. WriteHardware(HardWareAdress, value)
    12. Return -1
    13. Else : Return 0
    14. End If
    15. Else : Return 0
    16. End If
    17. Else : Return 0
    18. End If
    19. End Function
    20. <DllImport("inpout32.dll", EntryPoint:="Out32")>
    21. Private Shared Sub WriteHardware(ByVal add As Integer, ByVal value As Integer)
    22. End Sub
    23. <DllImport("inpout32.dll", EntryPoint:="Inp32")>
    24. Private Shared Function ReadHardware(ByVal add As Integer) As Integer
    25. End Function
    26. <Flags()>
    27. Public Enum Input As Integer
    28. Null = 0
    29. In00 = 8
    30. In01 = 16
    31. In02 = 32
    32. In03 = 64
    33. In04 = 128
    34. End Enum
    35. <Flags()>
    36. Public Enum Output As Integer
    37. Null = 0
    38. Out00 = 1
    39. Out01 = 2
    40. Out02 = 4
    41. Out03 = 8
    42. Out04 = 16
    43. Out05 = 32
    44. Out06 = 64
    45. Out07 = 128
    46. End Enum
    47. Private Sub UpdateHardware()
    48. EIn = CType(LPTConnector.LPTConnector.Read, Input)
    49. LPTConnector.LPTConnector.Write(CInt(EOut))
    50. End Sub


    Zwei Verschiedene Projekte, die Enums werden unter anderem zur Darstellung und Nutzung für Checkboxen in einer Form genutzt.


    Debugging hat gezeigt, das der Wert bereits beim einlesen nicht stimmt, also vermute ich keinen Fehler in meinem Quellcode.

    Ist ein entsprechender Fehler mit der Inpout.dll bekannt?
    Oder - wenn es vielleicht an meinem Port liegt, wie kann ich diesen ohne Drucker testen? Der angesprochene zweite Rechner steht nicht bei mir zuhause, mein Laptop hat keinen LPT und mein zweiter Rechner hat keinen prozessor, kann es also nicht effektiv testen daheim.
    Mein Drucker hat nur USB :/
    Hier aus meinem Archiv meine Anfänge mit der parallelen Schnittstelle:
    Dateien
    • Parallel.zip

      (22 kB, 413 mal heruntergeladen, zuletzt: )
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Zur Frage wie die Schalter geschaltet sind, Zitat vom "Erbauer":
    BTW: Ich glaube der User will wissen, wie die Pins quasi beschaltet sind. Sag ihm, auf 0-Level hängen sie in der Luft und mit 1-Level werden sie gegen Masse durchgeschaltet.


    Ergibt den selben Fehler. Ich werde schauen, dass ich einen Rechner finde, mit welchem ich testen kann, so langsam glaube ich das mein LPT ´nen Schuss weg hat... :/

    Aber Danke...
    Ich war jetzt davon ausgegangen, dass die QBasic Anwendung bei dir getestet wurde. So reicht ja schon ein falscher Modus der Schnittstelle, dass es nicht läuft wie gedacht.
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    LPT1 Schnittstellen Modus

    Hallo und einen schönen Abend, ich klinke mich dann auch mal in den Thread ein.

    Ist ja so deutlich einfacher, ich bin der "Erfinder" der besagten Platine.



    Es gibt ja mehrere Schnittstellen-Modi, ECP,EPP oder SPP (wobei SPP das Simple-Printer-Protocol darstellt).

    Ich glaube das es die SPP Option sein sollte.



    @ Kagurame: Du kannst ja mal im BIOS spielen. Das müsste irgendwo bei den Advanced Settings unter Super I/O Config zu finden sein.

    Den DMA Interrupt kannst du so lassen, das sollte keine Rolle spielen, ebenso die Adresse.

    (Die kannst Du auf den 378hex bzw. 888 stehen lassen, sonst geht ja nachher gar nichts mehr).





    Das Problem sehe ich folgendermaßen.

    An der Adresse 378hex befindet sich das Datenregister. Das sind von Bit 0 bis Bit 7 die einzelnen Leitungen zum Drucker hin (also unsere Ausgänge)

    Von der Möglichkeit, das ganze bi-direktional zu benutzen (denn diese Adressbits lassen sich auch andersherum betreiben, wie das bei Scannern damals war, da gabs halt 8 Eingangs-Adressdaten-Bits) sehe ich mal.



    An der Adresse 378hex + Offset 2 (also hex380 ist dezimal = schlag mich tot, 890) befindet sich das Status-Register, über welches der Drucker uns sagte, was los ist. Ich bin busy, mein Paper is out, oder sonst ein Error. Oder ok, ich hab verstanden -> Acknowledge.

    Aber in diesem Register sind nich alle Bits belegt.

    In QBasic war es kein Problem, da habe ich die die ganze Speicheraddresse ausgelesen und den gesamten Dezimalwert über mathemtische Operanden auf die einzelnen Stellen auseinander klabustert.





    Vielleicht hat die verwendete DLL damit ihre Probleme.



    Hat dazu jemand Erfahrungen oder hat es jemand schon einmal definitiv mit dieser DLL und dem Status-Register an der genannten Adresse geschafft etwas einzulesen?



    Vielen Dank, und ich hoffe, ich habe euch nicht überfordert mit meinem kleinem Roman.



    Mfg

    Crash486

    EDITH:
    Ach ja, bevor ich es vergesse:
    Die einzelnen Pins hängen in der Luft. Das hat bisjetzt an anderen PCs immer funktioniert.
    Ich habe auch schon davon gehört, sie mit extern +5V zu beschalten, um einen definierten Pegel zu erhalten, aber ich denke, das ist es nicht. Sollte es damit zusammenhängen, so müssten die Pins quasi "flattern" da sie, wenn sie nicht direkt gegen Masse (also Durchgang) auf einem nicht definierten Zustand liegen. Das hat sich dann darin geäußert, wenn man den Pins zu nahe kam (durch elektrostatische Felder), die Werte flatterten, zwischen 0 und 1.
    Mein Programm oben funktionierte damals unter Win XP einwandfrei mit der dll. Allerdings habe ich die Platine, mit welcher ich das getestet hatte, nicht mehr. Sonst würde ich es mit der aktuellen Hardware mal testen. Das Programm lief mit der gleichen Byte-Auswertung auch auf einem x486 Laptop unter Q-Basic. Den Quellcode habe ich aber nicht mehr auf meinem Rechner.
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Anderen Parallelport - anderer Rechner

    @Kai: die Adresse, die ich gestern Abend noch telefonisch gab, ist eh die falsche gewesene. Hatte einen Denkfehler.

    Mich beschleicht wirklich das Gefühl, das das gute Stück einen Schuss weghat.
    Deswegen hängen wir einen HP LaserJet 5L mal an die LPT und probieren die Platine an einem anderem Rechner aus. Allerdings mit Windows XP und der DLL unter VB.

    Crash486 schrieb:

    An der Adresse 378hex + Offset 2 (also hex380 ist dezimal = schlag mich tot, 890)


    Wenn du ein "Macher" einer Eingabeplatine bist,solltest du Mindesten zu einer Hexzahl 2 dazu addieren können.
    Viele nehmen deine Adressangabe für richtig und wundern sich dann,dass nichts funktioniert. ;)

    Es gibt auch noch einen Windoofs Rechner, :(


    Bei Unsicherheit ,immer Widerstände an die Eingänge.

    Gruß