Hilfe bei CH341A seriell/parallelwandler Ansteuerung mit VB6 ?

  • VB6

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    Hilfe bei CH341A seriell/parallelwandler Ansteuerung mit VB6 ?

    Hallo Freunde des gepflegten programmierens,

    ich bin etwas am Verzweifeln, weil ich das was ich dachte - daß es einfach sein müßte - nicht hinbekomme.
    Ich hatte vor 15 Jahren einmal einen Chip, der von USB auf Druckerport parallel umgewandelt hat und der war ganz einfach anzusteuern.
    Der wird nur nicht mehr hergestellt. Damals habe ich an die Ausgänge 0-7 je einen Optotriac angeschlossen und konnte damit 8 Glühbirnen über ein Programm steuern.
    War lustig für die private Kellerdisco! Der Chip ist kaputt und jetzt siuche ich nach einer Alternative und dachte mit diesem seriell/parallelwandler müßte das genauso funktionieren.
    Aber meine Programmierkenntnisse reichen nicht aus, um die API Beschreibung in ein funktionierendes VB6 Prog umzusetzen.
    Kann mir jemand helfen? Ich habe die CH341DLL.DLL installiert. Beschreibung ist im Anhang hochgeladen.

    Ich möchte nur 8 LED's an den Ausgängen D0-D7 anschliessen und sie dann vom Computer aus über USB ein- und ausschalten können.
    Kann mir jemand das als BV6 Script posten?

    Bei mir hakt es schon mit den Deklarationen bei denen ich nicht weiß wie ich damit umgehen muß.
    Function CH341OpenDevice(iIndex: cardinal): integer; Stdcall; external 'CH341DLL.DLL'
    iIndex ist in der API beschrieben, aber was ist cardinal und der Rest???

    Nach meinem Verständnis müßte das "einfach" funktionieren?

    # Also Verbindung mit CH341A herstellen - Parallele Datenübertragung
    Function CH341InitParallel(iIndex: cardinal; iMode :cardinal): boolean; Stdcall; external 'CH341DLL.DLL';
    Function CH341WriteData0(iIndex:cardinal; iBuffer: PVOID; ioLength: PULONG :( boolean; Stdcall; external 'CH341DLL.DLL';
    # Data senden an Kanal + Status? Kanal D0 einschalten mit Senden von 1 ausschalten mit 0
    iIndex = D0: cardinal = 1
    # schliessen der Prozedur
    procedure CH341CloseDevice(iIndex: cardinal); Stdcall; external 'CH341DLL.DLL';

    Oder muß man die Druckerversion verwenden?
    Bei AMAZON gibt es die Platine mit dieser Beschreibung:
    amazon.de/DollaTek-CH341A-UART…llelwandler/dp/B07DJZDRKG

    Arbeitsmodus (Jumper-Kappe rechts von USB):
    (1) UART-Modell: Die Jumper-Kappe wird in den UART gesteckt, die D2-Kontrollleuchte (blau) eingeschaltet;
    (2) I2C / SPI und EPP / MEM Parallelbetrieb: Die Jumperkappe wird in die I2C / SPI eingelegt, die D1-Kontrollleuchte (rot) eingeschaltet;
    (3) Der Parallel-Port-Modus des Druckers: die Notwendigkeit, die Jumper zu trennen, und SDA und SCL miteinander verbunden sind.

    SDA und SCL finde ich aber auch nicht...

    Kann mir das jemand so bauen, daß es funktionieren müßte?
    Ich schaffe das mit meinen VB6 Kenntnissen nicht.

    Vieeeeelen Dank !
    Bilder
    • 51gZHQCI96L._AC_SL1000_b.jpg

      41,4 kB, 868×458, 29 mal angesehen
    • 51Pq0Fe4h2L._AC_SL1000_a.jpg

      59,08 kB, 855×502, 39 mal angesehen
    Dateien
    Hi. Datentyp Cardinal -> oreilly.com/library/view/delphi-in-a/1565926595/re33.html VB6 kennt aber keine unsigned Datentypen (z.B. ULong), bis auf Byte. Ich würde dennoch einfach mal den Datentyp Long (32bit) verwenden.
    Mfg -Franky-
    Vielen lieben Dank!
    Aber das ist mir schon zu hoch.
    Ich kann Funktionen programmieren, aber bei Function Deklarationen hakt es.
    Kann mir das jemand so zusammenbauen, daß ich verstehe iwe ich Daten zu dem Teil schicken kann?

    Meine Derklaration vom alten Chip sieht so aus:
    Damit konnte ich die USB Portnummer einstellen und meine 8 LEDs ein- und Ausschalten.
    Kann mir das jemand so schnitzen, daß das auch mit diesem Chip funktioniert?
    Oder mir eine Chipplatine empfehlen, mit der das funktioniert und wo es ein VB6 Beispielprog. dafür gibt?
    Wär echt super!!!
    Danke Leute

    USBModul:

    Visual Basic-Quellcode

    1. Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, _
    2. ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _
    3. ByVal lpSecurityAttributes As Long, _
    4. ByVal dwCreationDisposition As Long, _
    5. ByVal dwFlagsAndAttributes As Long, _
    6. ByVal hTemplateFile As Long) As Long
    7. Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, _
    8. lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, _
    9. ByVal nOutBufferSize As Long, lpBytesReturned As Long, _
    10. lpOverlapped As Any) As Long
    11. Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    12. Public Const GENERIC_READ = &H80000000 'Public hinzugefügt, damit ich auch in Form1 damit arbeiten kann
    13. Public Const GENERIC_WRITE = &H40000000
    14. Public Const FILE_SHARE_WRITE = &H2
    15. Public Const FILE_SHARE_READ = &H1
    16. Public Const OPEN_EXISTING = &H3


    USBForm:

    Visual Basic-Quellcode

    1. Private Sub Form_Load()
    2. For i = 0 To 127
    3. List1.AddItem i
    4. Next i
    5. List1.ListIndex = 0
    6. End Sub
    7. Sub USB_IO()
    8. sFileName = "\\.\CompuLABusb_" & List1
    9. hgDrvrHnd = CreateFile(sFileName, GENERIC_WRITE Or GENERIC_READ, FILE_SHARE_WRITE Or FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0)
    10. lTemp = DeviceIoControl(hgDrvrHnd, 4&, lIn, lInSize, lOut, lOutSize, lSize, gOverlapped)
    11. htemp = CloseHandle(hgDrvrHnd)
    12. End Sub
    13. Sub WrPort(Wert)
    14. lIn = 65536 * Wert + 0 * 256 + 21
    15. lInSize = 3
    16. lOutSize = 1
    17. USB_IO
    18. End Sub
    19. Private Sub Timer1_Timer()
    20. dat = 0
    21. dat = dat + Check1.Value
    22. dat = dat + Check2.Value * 2
    23. dat = dat + Check3.Value * 4
    24. dat = dat + Check4.Value * 8
    25. dat = dat + Check5.Value * 16
    26. dat = dat + Check6.Value * 32
    27. dat = dat + Check7.Value * 64
    28. dat = dat + Check8.Value * 128
    29. WrPort dat
    30. If Check1.Value = 1 Then
    31. Image1.Visible = False
    32. Else
    33. Image1.Visible = True
    34. End If
    35. If Check2.Value = 1 Then
    36. Image2.Visible = False
    37. Else
    38. Image2.Visible = True
    39. End If
    40. If Check3.Value = 1 Then
    41. Image3.Visible = False
    42. Else
    43. Image3.Visible = True
    44. End If
    45. If Check4.Value = 1 Then
    46. Image4.Visible = False
    47. Else
    48. Image4.Visible = True
    49. End If
    50. If Check5.Value = 1 Then
    51. Image5.Visible = False
    52. Else
    53. Image5.Visible = True
    54. End If
    55. If Check6.Value = 1 Then
    56. Image6.Visible = False
    57. Else
    58. Image6.Visible = True
    59. End If
    60. If Check7.Value = 1 Then
    61. Image7.Visible = False
    62. Else
    63. Image7.Visible = True
    64. End If
    65. If Check8.Value = 1 Then
    66. Image8.Visible = False
    67. Else
    68. Image8.Visible = True
    69. End If
    70. End Sub


    Code-Tags eingefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    stefan67 schrieb:

    Function CH341InitParallel(iIndex: cardinal; iMode :cardinal): boolean; Stdcall; external 'CH341DLL.DLL';

    Würde ich folgendermaßen nach VB6 übersetzen:
    Private Declare Function CH341InitParallel Lib "CH341DLL.DLL" (ByVal iIndex as Long, ByVal iMode as Long) As Long.

    stefan67 schrieb:

    procedure CH341CloseDevice(iIndex: cardinal); Stdcall; external 'CH341DLL.DLL';

    Könnte ein Sub sein. Private Declare Sub CH341CloseDevice Lib "CH341DLL.DLL" (ByVal iIndex As Long)

    stefan67 schrieb:

    Function CH341WriteData0(iIndex:cardinal; iBuffer: PVOID; ioLength: PULONG boolean; Stdcall; external 'CH341DLL.DLL';

    Hier bin ich mir nicht zu 100% sicher. Könnte aber so aussehen. Private Declare Function CH341WriteData0 Lib "CH341DLL.DLL" (ByVal iIndex as Long, ByVal iBuffer as Long, ByRef ioLenght as Long) As Long
    iBuffer könnte man evtl. auch As Any probieren. Je nachdem ob die lieber einen Pointer per VarPtr(Buffer(0)) -> ByVal oder direkt den Buffer -> ByRef iBuffer As Any übergeben möchtest. iBuffer könnte ein LongArray sein. ioLenght könnte ein [In],Out Parameter sein wo die Größe des Arrays übergeben wird und nach Aufruf der API steht dann hier wieviel Daten geschrieben wurden. Auch wenn bei den Funktionen as Rückgabe :boolean steht, würde ich das als As Long auslegen. Die Rückgabe wandelst dann mit CBool in ein Boolean um.
    Mfg -Franky-