Variable richtig deklarieren

  • Ok ;)

    Also wenn ich das richtig verstehe, dann setzt man mit

    [autoit]

    DLLStructSetData($tIOWKIT40_IO_REPORT, ...)

    [/autoit]

    den Wert, der in den Speicher meines IOW´s geschrieben werden soll. in der Anleitung von

    [autoit]

    DLLStructSetData

    [/autoit]

    steht, das noch ein Element ausgewählt werden muss. Kann ich dafür

    [autoit]

    $IOWKIT40_IO_REPORT

    [/autoit]

    verwenden ? Also z.B.

    [autoit]

    DLLStructSetData($tIOWKIT40_IO_REPORT, $IOWKIT40_IO_REPORT, 00000000)

    [/autoit]

    Oder soll das Element im Sinne von z.B. einem "ulong" geschrieben werden ?

    lg Tim

  • Also ich habe es nun 3 mal durchgelesen (die Hilfe) und bin der MEinung, das das so richtig ist:

    [autoit]

    $tIOWKIT40_IO_REPORT = DLLStructCreate($IOWKIT40_IO_REPORT)
    DLLStructSetData($tIOWKIT40_IO_REPORT,$tIOWKIT40_IO_REPORT, 0x00000000 )
    $write = _IowKitWrite($ahIOW[$i-1], $IOW_PIPE_IO_PINS, $tIOWKIT40_IO_REPORT , $IOWKIT40_IO_REPORT_SIZE);
    If Not $write = $IOWKIT40_IO_REPORT_SIZE Then
    ConsoleWrite("Fail to send Data to IOW " & $serial & @CRLF)
    Exit
    EndIf

    [/autoit]


    Leider hängt sich das Script auf. So, wieso habe ich das so gemacht ? Meine Begründung:

    DLLStructSetData($tIOWKIT40_IO_REPORT,$tIOWKIT40_IO_REPORT, 0x00000000 )

    $tIOWKIT40_IO_REPORT <- Weil das ja die Variable ist, in der der Wert eingeschrieben werden soll.
    $tIOWKIT40_IO_REPORT <- Weil das die Variable ist, die von DLLStructCreate festgelegt worden ist. (Siehe Hilfe)
    0x00000000 <- Weil das der Wert zum Testen ist, um alle LED´s zum leuchten zu bringen

    So, ich wüsste nicht mehr, was noch falsch sein könnte. Ich habe auch schon anstadt $tIOWKIT40_IO_REPORT ,$IOWKIT40_IO_REPORT versucht, aber keine Changse.

    lg Tim

  • Das sieht schon mal nicht so schlecht aus. Die DLLStruct besteht aus mehreren Elementen,
    IOWKIT40_IO_REPORT hat z.B.den byte-Wert ReportId und den DWORD Value. Du willst sicher den Wert von Value setzen ;)

    [autoit]

    $tIOWKIT40_IO_REPORT = DLLStructCreate($IOWKIT40_IO_REPORT) ; korrekt
    DLLStructSetData($tIOWKIT40_IO_REPORT, "Value", 0x00000000 ) ; hier war was falsch
    $write = _IowKitWrite($ahIOW[$i-1], $IOW_PIPE_IO_PINS, DLLStructGetPtr($tIOWKIT40_IO_REPORT) , $IOWKIT40_IO_REPORT_SIZE) ; Würde ich so machen, die UDF sollte aber auch deine Version erlauben
    If Not ($write = $IOWKIT40_IO_REPORT_SIZE) Then ; Klammern nicht vergessen. Not bindet stärker als der Vergleich
    ConsoleWrite("Fail to send Data to IOW " & $serial & @CRLF)
    Exit
    EndIf

    [/autoit]
  • Hey, danke dir. Ich habe es eben mit folgendem Script versucht:

    Spoiler anzeigen
    [autoit]

    #include "iowkit.au3"

    [/autoit] [autoit][/autoit] [autoit]

    Global $ahIOW[$IOWKIT_MAX_DEVICES]

    [/autoit] [autoit][/autoit] [autoit]

    If Not _IowKitStartUp() Then ; Die Dll wird geladen
    ConsoleWrite("Failed to load iowkit dll" & @CRLF)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Open device
    Global $devHandle = _IowKitOpenDevice() ; Die Verbindung zum Warrior wird hergestellt
    If Not $devHandle Then
    ConsoleWrite("Failed to open device" & @CRLF)
    Exit
    EndIf
    ConsoleWrite("Device Opened" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; Get number of IOWs in system
    $numIows = _IowKitGetNumDevs() ; Gibt die Anzahl an IOW´s im System wider
    ConsoleWrite(StringFormat("%d IOWs in system\n", $numIows))
    ; Get all IOW handles
    Dim $serial ; Variable wird deklariert
    For $i = 1 To $numIows
    ;~ ConsoleWrite("+Loop " & $i & '/' & $numIows & @CRLF)
    ; Get device handle and init object
    $ahIOW[$i-1] = _IowKitGetDeviceHandle($i) ; Gibt ein Handle für einen der IOW´s zurück
    ;~ ConsoleWrite("-after _IowKitGetDeviceHandle" & @CRLF)
    ; Get serial number
    _IowKitGetSerialNumber($ahIOW[$i-1], $serial); Schreibt die Seriennummer in einen buffer ( serial )
    ;~ ConsoleWrite("-after _IowKitGetSerialNumber" & @CRLF)
    $pid = _IowKitGetProductId($ahIOW[$i-1]) ; Gibt die Produkt ID des IOW´s zurück. Bei den 40ern ist es meist die 1500
    ConsoleWrite(StringFormat('%d PID %x, S/N "%s"\n', $i, $pid, $serial));
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $tIOWKIT40_IO_REPORT = DLLStructCreate($IOWKIT40_IO_REPORT) ; korrekt
    ConsoleWrite("Ok 1" & @CRLF)
    DLLStructSetData($tIOWKIT40_IO_REPORT, "Value", 0x00000000 ) ; hier war was falsch
    ConsoleWrite("Ok 2" & @CRLF)
    $write = _IowKitWrite($ahIOW[$i-1], $IOW_PIPE_IO_PINS, DLLStructGetPtr($tIOWKIT40_IO_REPORT) , $IOWKIT40_IO_REPORT_SIZE) ; Würde ich so machen, die UDF sollte aber auch deine Version erlauben
    ConsoleWrite("Ok 3" & @CRLF)
    If Not ($write = $IOWKIT40_IO_REPORT_SIZE) Then ; Klammern nicht vergessen. Not bindet stärker als der Vergleich
    ConsoleWrite("Fail to send Data to IOW " & $serial & @CRLF)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Close device
    _IowKitCloseDevice($devHandle);
    ConsoleWrite("Device closed" & @CRLF)

    [/autoit]

    Als Antwort bekomme ich leider

    [autoit]

    >"D:\Programme\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\User\Desktop\test2.au3"
    Device Opened
    1 IOWs in system
    1 PID 1500, S/N "0000387C"

    [/autoit]

    Hm, was ist denn an

    [autoit]

    $tIOWKIT40_IO_REPORT = DLLStructCreate($IOWKIT40_IO_REPORT) ; korrekt

    [/autoit]

    falsch ?

    lg Tim

  • Ach ja, die Variable, in der die Strukturdefinition gespeichert ist, heißt $tagIOWKIT40_IO_REPORT. DU hättest nur mal in die include-Datei schauen müssen ;)

    [autoit]

    $tIOWKIT40_IO_REPORT = DLLStructCreate($tagIOWKIT40_IO_REPORT) ; korrekt

    [/autoit]
  • Hm, irgendetwas stimmt nicht ;(

    Spoiler anzeigen
    [autoit]

    $tIOWKIT40_IO_REPORT = DLLStructCreate($tagIOWKIT40_IO_REPORT) ; korrekt
    ConsoleWrite("Ok 1" & @CRLF)
    DLLStructSetData($tIOWKIT40_IO_REPORT, "Value", 0x00000000 ) ; hier war was falsch
    ConsoleWrite("Ok 2" & @CRLF)
    $write = _IowKitWrite($ahIOW[$i-1], $IOW_PIPE_IO_PINS, DLLStructGetPtr($tIOWKIT40_IO_REPORT) , $IOWKIT40_IO_REPORT_SIZE) ; Würde ich so machen, die UDF sollte aber auch deine Version erlauben
    ConsoleWrite("Ok 3" & @CRLF)
    If Not ($write = $IOWKIT40_IO_REPORT_SIZE) Then ; Klammern nicht vergessen. Not bindet stärker als der Vergleich
    ConsoleWrite("Fail to send Data to IOW " & $serial & @CRLF)
    Exit
    EndIf

    [/autoit]

    Zurück kommt

    [autoit]

    >"D:\Programme\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\User\Desktop\test2.au3"
    Device Opened
    1 IOWs in system
    1 PID 1500, S/N "0000387C"
    Ok 1
    Ok 2
    Ok 3
    Fail to send Data to IOW 0000387C

    [/autoit]

    und es häng mal wider ?
    das kann doch nicht sein. Also soweit müssen ja alle Befehle stimmen. Sonnst würde es nicht bis OK 3 kommen. Irgendetwas muss beim senden schief gehen.

  • Versuche mal _WinAPI_GetLastError und _WinAPI_GetLastErrorMessage ;)

    PS: Die DLL hat anscheinend was dagegen, dass das programm per Exit beendet wird, ohne dass die Handles geschlossen werden. Deshalb hängt sich AutoIt auf.

  • Setz es in eine MsgBox bei OK3. An dieser Stelle ist doch der DLLCall durch und du willst ja wissen, welcher Fehler auftrat.

  • Jo, also nun so:

    Spoiler anzeigen
    [autoit]

    #include "iowkit.au3"
    #Include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $ahIOW[$IOWKIT_MAX_DEVICES]

    [/autoit] [autoit][/autoit] [autoit]

    If Not _IowKitStartUp() Then ; Die Dll wird geladen
    ConsoleWrite("Failed to load iowkit dll" & @CRLF)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Open device
    Global $devHandle = _IowKitOpenDevice() ; Die Verbindung zum Warrior wird hergestellt
    If Not $devHandle Then
    ConsoleWrite("Failed to open device" & @CRLF)
    ;~ _IowKitCloseDevice($devHandle);
    Exit
    EndIf
    ConsoleWrite("Device Opened" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; Get number of IOWs in system
    $numIows = _IowKitGetNumDevs() ; Gibt die Anzahl an IOW´s im System wider
    ConsoleWrite(StringFormat("%d IOWs in system\n", $numIows))
    ; Get all IOW handles
    Dim $serial ; Variable wird deklariert
    For $i = 1 To $numIows
    ;~ ConsoleWrite("+Loop " & $i & '/' & $numIows & @CRLF)
    ; Get device handle and init object
    $ahIOW[$i-1] = _IowKitGetDeviceHandle($i) ; Gibt ein Handle für einen der IOW´s zurück
    ;~ ConsoleWrite("-after _IowKitGetDeviceHandle" & @CRLF)
    ; Get serial number
    _IowKitGetSerialNumber($ahIOW[$i-1], $serial); Schreibt die Seriennummer in einen buffer ( serial )
    ;~ ConsoleWrite("-after _IowKitGetSerialNumber" & @CRLF)
    $pid = _IowKitGetProductId($ahIOW[$i-1]) ; Gibt die Produkt ID des IOW´s zurück. Bei den 40ern ist es meist die 1500
    ConsoleWrite(StringFormat('%d PID %x, S/N "%s"\n', $i, $pid, $serial));
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $tIOWKIT40_IO_REPORT = DLLStructCreate($tagIOWKIT40_IO_REPORT) ; korrekt
    ConsoleWrite("Ok 1" & @CRLF)
    DLLStructSetData($tIOWKIT40_IO_REPORT, "Value", 0x00000000 ) ; hier war was falsch
    ConsoleWrite("Ok 2" & @CRLF)
    $write = _IowKitWrite($ahIOW[$i-1], $IOW_PIPE_IO_PINS, DLLStructGetPtr($tIOWKIT40_IO_REPORT) , $IOWKIT40_IO_REPORT_SIZE) ; Würde ich so machen, die UDF sollte aber auch deine Version erlauben
    ConsoleWrite("Ok 3" & @CRLF)
    msgbox(0,"",_WinAPI_GetLastErrorMessage())
    If Not ($write = $IOWKIT40_IO_REPORT_SIZE) Then ; Klammern nicht vergessen. Not bindet stärker als der Vergleich
    ConsoleWrite("Fail to send Data to IOW " & $serial & @CRLF)
    ;~ _IowKitCloseDevice($devHandle);
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Close device
    _IowKitCloseDevice($devHandle);
    ConsoleWrite("Device closed" & @CRLF),

    [/autoit]

    Als Antwort bekomme ich "Falscher Parameter".
    Wenn ich das durch msgbox(0,"",_WinAPI_GetLastError()) ersetzte, bekomme ich 87 zurück.

    lg Tim

  • Welchen Wert hat $i denn?

    [autoit]

    For $i = 1 To 1
    Next
    MsgBox(0, '', $i) ; Wert von $i: 2 (ZWEI) !!!

    [/autoit]
  • An der Stelle meiner MSGBOX hat $i einen Wert von 2. Wenn du Ihn dann teilst, wird er 1 haben :)

    Spoiler anzeigen
    [autoit]

    #include "iowkit.au3"
    #Include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $ahIOW[$IOWKIT_MAX_DEVICES]

    [/autoit] [autoit][/autoit] [autoit]

    If Not _IowKitStartUp() Then ; Die Dll wird geladen
    ConsoleWrite("Failed to load iowkit dll" & @CRLF)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Open device
    Global $devHandle = _IowKitOpenDevice() ; Die Verbindung zum Warrior wird hergestellt
    If Not $devHandle Then
    ConsoleWrite("Failed to open device" & @CRLF)
    ;~ _IowKitCloseDevice($devHandle);
    Exit
    EndIf
    ConsoleWrite("Device Opened" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; Get number of IOWs in system
    $numIows = _IowKitGetNumDevs() ; Gibt die Anzahl an IOW´s im System wider
    ConsoleWrite(StringFormat("%d IOWs in system\n", $numIows))
    ; Get all IOW handles
    Dim $serial ; Variable wird deklariert
    For $i = 1 To $numIows
    ;~ ConsoleWrite("+Loop " & $i & '/' & $numIows & @CRLF)
    ; Get device handle and init object
    $ahIOW[$i-1] = _IowKitGetDeviceHandle($i) ; Gibt ein Handle für einen der IOW´s zurück
    ;~ ConsoleWrite("-after _IowKitGetDeviceHandle" & @CRLF)
    ; Get serial number
    _IowKitGetSerialNumber($ahIOW[$i-1], $serial); Schreibt die Seriennummer in einen buffer ( serial )
    ;~ ConsoleWrite("-after _IowKitGetSerialNumber" & @CRLF)
    $pid = _IowKitGetProductId($ahIOW[$i-1]) ; Gibt die Produkt ID des IOW´s zurück. Bei den 40ern ist es meist die 1500
    ConsoleWrite(StringFormat('%d PID %x, S/N "%s"\n', $i, $pid, $serial));
    Next
    MsgBox(0, '', $i)

    [/autoit] [autoit][/autoit] [autoit]

    $tIOWKIT40_IO_REPORT = DLLStructCreate($tagIOWKIT40_IO_REPORT) ; korrekt
    ConsoleWrite("Ok 1" & @CRLF)
    DLLStructSetData($tIOWKIT40_IO_REPORT, "Value", 0x00000000 ) ; hier war was falsch
    ConsoleWrite("Ok 2" & @CRLF)
    $write = _IowKitWrite($ahIOW[$i-1], $IOW_PIPE_IO_PINS, DLLStructGetPtr($tIOWKIT40_IO_REPORT) , $IOWKIT40_IO_REPORT_SIZE) ; Würde ich so machen, die UDF sollte aber auch deine Version erlauben
    ConsoleWrite("Ok 3" & @CRLF)
    ;~ msgbox(0,"",_WinAPI_GetLastErrorMessage())
    msgbox(0,"",_WinAPI_GetLastError())
    If Not ($write = $IOWKIT40_IO_REPORT_SIZE) Then ; Klammern nicht vergessen. Not bindet stärker als der Vergleich
    ConsoleWrite("Fail to send Data to IOW " & $serial & @CRLF)
    ;~ _IowKitCloseDevice($devHandle);
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Close device
    _IowKitCloseDevice($devHandle);
    ConsoleWrite("Device closed" & @CRLF)

    [/autoit]


    oder meinst du, man muss Ihn an der Stelle meiner Msgbox, durch 2 teilen ?

    lg Tim

  • Ich würde den Block entweder mit in die Schleife nehmen oder den Index direkt ansprechen. Nach der For-Schleife hat $i keinen gültigen Wert mehr.

    Du hast genu ein Gerät angeschlossen, das wird im Index 0 gespeichert. Also solltest du auch den Index 0 verwenden und nicht 1

  • So, das Schreiben Funktionniert !!!

    [autoit]

    #include "iowkit.au3"
    #Include <WinAPI.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $ahIOW[$IOWKIT_MAX_DEVICES]

    [/autoit][autoit][/autoit][autoit]

    If Not _IowKitStartUp() Then ; Die Dll wird geladen
    ConsoleWrite("Failed to load iowkit dll" & @CRLF)
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ; Open device
    Global $devHandle = _IowKitOpenDevice() ; Die Verbindung zum Warrior wird hergestellt
    If Not $devHandle Then
    ConsoleWrite("Failed to open device" & @CRLF)
    ;~ _IowKitCloseDevice($devHandle);
    Exit
    EndIf
    ConsoleWrite("Device Opened" & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    ; Get number of IOWs in system
    $numIows = _IowKitGetNumDevs() ; Gibt die Anzahl an IOW´s im System wider
    ConsoleWrite(StringFormat("%d IOWs in system\n", $numIows))
    ; Get all IOW handles
    Dim $serial ; Variable wird deklariert
    For $i = 1 To $numIows
    ;~ ConsoleWrite("+Loop " & $i & '/' & $numIows & @CRLF)
    ; Get device handle and init object
    $ahIOW[$i-1] = _IowKitGetDeviceHandle($i) ; Gibt ein Handle für einen der IOW´s zurück
    ;~ ConsoleWrite("-after _IowKitGetDeviceHandle" & @CRLF)
    ; Get serial number
    _IowKitGetSerialNumber($ahIOW[$i-1], $serial); Schreibt die Seriennummer in einen buffer ( serial )
    ;~ ConsoleWrite("-after _IowKitGetSerialNumber" & @CRLF)
    $pid = _IowKitGetProductId($ahIOW[$i-1]) ; Gibt die Produkt ID des IOW´s zurück. Bei den 40ern ist es meist die 1500
    ConsoleWrite(StringFormat('%d PID %x, S/N "%s"\n', $i, $pid, $serial));


    $tIOWKIT40_IO_REPORT = DLLStructCreate($tagIOWKIT40_IO_REPORT) ; korrekt
    ConsoleWrite("Ok 1" & @CRLF)
    DLLStructSetData($tIOWKIT40_IO_REPORT, "Value", 0x0FFFFFFF ) ; hier war was falsch
    ConsoleWrite("Ok 2" & @CRLF)
    $write = _IowKitWrite($ahIOW[$i-1], $IOW_PIPE_IO_PINS, DLLStructGetPtr($tIOWKIT40_IO_REPORT) , $IOWKIT40_IO_REPORT_SIZE) ; Würde ich so machen, die UDF sollte aber auch deine Version erlauben
    ConsoleWrite("Ok 3" & @CRLF)
    ;~ msgbox(0,"",_WinAPI_GetLastErrorMessage())
    msgbox(0,"",_WinAPI_GetLastError())
    If Not ($write = $IOWKIT40_IO_REPORT_SIZE) Then ; Klammern nicht vergessen. Not bindet stärker als der Vergleich
    ConsoleWrite("Fail to send Data to IOW " & $serial & @CRLF)
    ;~ _IowKitCloseDevice($devHandle);
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Next

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    MsgBox(0, '', $i)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; Close device
    _IowKitCloseDevice($devHandle);
    ConsoleWrite("Device closed" & @CRLF)

    [/autoit]
  • So, habe mich nun zwei Tage mit der Schreib Funktion auseinander gesezt, und ein wenig herum gespielt. (Lauflicht , Knight-Rider,...) aber nun ist ja auch der Digitale Input wichtig. Also nicht nur die Ausgabe sondern die Eingabe von Signalen.

    Das lässt sich mit der Funktion _IOWKITRead machen. Da gibt es 3 verschiedene:

    - IowKitRead
    - IowKitReadNonBlocking
    - IowKitReadImmediate

    Mein ziehl ist es, einfach nur ein 32Bit wort zu bekommen, wie gerade die Bits am IOW stehen. Also habe ich mich für die Funktion IowKitReadImmediate entschieden. Dazu habe ich ein Beispielscript verfasst:

    Spoiler anzeigen
    [autoit]

    #include "iowkit.au3"
    #Include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $ahIOW[$IOWKIT_MAX_DEVICES]
    Dim $bits

    [/autoit] [autoit][/autoit] [autoit]

    If Not _IowKitStartUp() Then ; Die Dll wird geladen
    ConsoleWrite("Failed to load iowkit dll" & @CRLF)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Open device
    Global $devHandle = _IowKitOpenDevice() ; Die Verbindung zum Warrior wird hergestellt
    If Not $devHandle Then
    ConsoleWrite("Failed to open device" & @CRLF)
    ;~ _IowKitCloseDevice($devHandle);
    Exit
    EndIf
    ConsoleWrite("Device Opened" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; Get number of IOWs in system
    $numIows = _IowKitGetNumDevs() ; Gibt die Anzahl an IOW´s im System wider
    ConsoleWrite(StringFormat("%d IOWs in system\n", $numIows))
    ; Get all IOW handles
    Dim $serial ; Variable wird deklariert

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $numIows
    ;~ ConsoleWrite("+Loop " & $i & '/' & $numIows & @CRLF)
    ; Get device handle and init object
    $ahIOW[$i-1] = _IowKitGetDeviceHandle($i) ; Gibt ein Handle für einen der IOW´s zurück
    ;~ ConsoleWrite("-after _IowKitGetDeviceHandle" & @CRLF)
    ; Get serial number
    _IowKitGetSerialNumber($ahIOW[$i-1], $serial); Schreibt die Seriennummer in einen buffer ( serial )
    ;~ ConsoleWrite("-after _IowKitGetSerialNumber" & @CRLF)
    $pid = _IowKitGetProductId($ahIOW[$i-1]) ; Gibt die Produkt ID des IOW´s zurück. Bei den 40ern ist es meist die 1500
    ConsoleWrite(StringFormat('%d PID %x, S/N "%s"\n', $i, $pid, $serial));

    ;~ Msgbox(0,"",_WinAPI_GetLastErrorMessage())

    If Not _IowKitReadImmediate($ahIOW[$i-1],$bits) Then
    Msgbox(0,"",_WinAPI_GetLastErrorMessage())
    ConsoleWrite("Can´t Read ...")
    Exit ; Nur bei geschlossenem Handle
    EndIf

    Msgbox(0,"",$bits[0])

    [/autoit] [autoit][/autoit] [autoit]


    ;~ $tIOWKIT40_IO_REPORT = DLLStructCreate($tagIOWKIT40_IO_REPORT) ; korrekt
    ;~ DLLStructSetData($tIOWKIT40_IO_REPORT, "Value", 0x0FFFFFFF ) ; hier war was falsch
    ;~ $write = _IowKitWrite($ahIOW[$i-1], $IOW_PIPE_IO_PINS, DLLStructGetPtr($tIOWKIT40_IO_REPORT) , $IOWKIT40_IO_REPORT_SIZE) ; Würde ich so machen, die UDF sollte aber auch deine Version erlauben

    [/autoit] [autoit][/autoit] [autoit]

    ;~ If Not ($write = $IOWKIT40_IO_REPORT_SIZE) Then ; Klammern nicht vergessen. Not bindet stärker als der Vergleich
    ;~ ConsoleWrite("Fail to send Data to IOW " & $serial & @CRLF)
    ;~ _IowKitCloseDevice($devHandle);
    ;~ Exit
    ;~ EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Close device
    _IowKitCloseDevice($devHandle);
    ConsoleWrite("Device closed" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]

    Leider bekomme ich als _API folgendes zurück : "Der Vorgang wurde erfolgreich beendet." Dann wird in die Konsole "Can´t Read" geschrieben. Ich denke ich habe einfach etwas einfaches übersehen, vergessen, oder zuviel. Denn ich habe ja, wie man sicher sehen kann einfach nur das Write Script eben soweit auskommentiert, und das Read eingefügt.

    Oder meint/st du/Ihr das es einfacher ist eine der ander beiden Funktionen zu nutzen ?

    Und wenn nicht, wo liegt dann mein Fehlen? Weil viel ist ja für die oben genannte Funktion von mir nicht nötig ;)

    lg Tim

  • Die Funktion _IowKitReadImmediate ist fehlerhaft. Als Rückgabewert im DLLCall steht hier "none", es muss aber 'BOOL' sein. Daher gibt die Funktion gerade immer 0 zurück, egal was passiert. Wenn du das änderst, solltest du bei Erfolg eine 1 bekommen.

  • Danke dir. Ich habe nun in der DLL das none durch BOOl ersetzt. in meinem Script hängt es sich nun auf:

    Spoiler anzeigen
    [autoit]

    #include "iowkit.au3"
    #Include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $ahIOW[$IOWKIT_MAX_DEVICES]
    Dim $bits

    [/autoit] [autoit][/autoit] [autoit]

    If Not _IowKitStartUp() Then ; Die Dll wird geladen
    ConsoleWrite("Failed to load iowkit dll" & @CRLF)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Open device
    Global $devHandle = _IowKitOpenDevice() ; Die Verbindung zum Warrior wird hergestellt
    If Not $devHandle Then
    ConsoleWrite("Failed to open device" & @CRLF)
    ;~ _IowKitCloseDevice($devHandle);
    Exit
    EndIf
    ConsoleWrite("Device Opened" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; Get number of IOWs in system
    $numIows = _IowKitGetNumDevs() ; Gibt die Anzahl an IOW´s im System wider
    ConsoleWrite(StringFormat("%d IOWs in system\n", $numIows))
    ; Get all IOW handles
    Dim $serial ; Variable wird deklariert

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $numIows
    ;~ ConsoleWrite("+Loop " & $i & '/' & $numIows & @CRLF)
    ; Get device handle and init object
    $ahIOW[$i-1] = _IowKitGetDeviceHandle($i) ; Gibt ein Handle für einen der IOW´s zurück
    ;~ ConsoleWrite("-after _IowKitGetDeviceHandle" & @CRLF)
    ; Get serial number
    _IowKitGetSerialNumber($ahIOW[$i-1], $serial); Schreibt die Seriennummer in einen buffer ( serial )
    ;~ ConsoleWrite("-after _IowKitGetSerialNumber" & @CRLF)
    $pid = _IowKitGetProductId($ahIOW[$i-1]) ; Gibt die Produkt ID des IOW´s zurück. Bei den 40ern ist es meist die 1500
    ConsoleWrite(StringFormat('%d PID %x, S/N "%s"\n', $i, $pid, $serial));

    ;~ Msgbox(0,"",_WinAPI_GetLastErrorMessage())

    If Not _IowKitReadImmediate($ahIOW[$i-1],$bits) Then
    Msgbox(0,"",_WinAPI_GetLastErrorMessage())
    ConsoleWrite("Can´t Read ...")
    Exit ; Nur bei geschlossenem Handle
    EndIf

    Msgbox(0,"",$bits[0])

    [/autoit] [autoit][/autoit] [autoit]


    ;~ $tIOWKIT40_IO_REPORT = DLLStructCreate($tagIOWKIT40_IO_REPORT) ; korrekt
    ;~ DLLStructSetData($tIOWKIT40_IO_REPORT, "Value", 0x0FFFFFFF ) ; hier war was falsch
    ;~ $write = _IowKitWrite($ahIOW[$i-1], $IOW_PIPE_IO_PINS, DLLStructGetPtr($tIOWKIT40_IO_REPORT) , $IOWKIT40_IO_REPORT_SIZE) ; Würde ich so machen, die UDF sollte aber auch deine Version erlauben

    [/autoit] [autoit][/autoit] [autoit]

    ;~ If Not ($write = $IOWKIT40_IO_REPORT_SIZE) Then ; Klammern nicht vergessen. Not bindet stärker als der Vergleich
    ;~ ConsoleWrite("Fail to send Data to IOW " & $serial & @CRLF)
    ;~ _IowKitCloseDevice($devHandle);
    ;~ Exit
    ;~ EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Close device
    _IowKitCloseDevice($devHandle);
    ConsoleWrite("Device closed" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]

    Das ist merkwürdig. Ich bekomme auch keinen Error. Ich bekomme von der Konsole folgendes:

    Spoiler anzeigen
    [autoit]

    >"D:\Programme\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\User\Desktop\FUNKIONSTÜCHTIG.au3"
    Device Opened
    1 IOWs in system
    1 PID 1500, S/N "0000387C"

    [/autoit]

    lg Tim