IowKitOpenDevice liefert 8978137891377040648 in der Rückgabe

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
Mike_J
Posts: 7
Joined: Fri Jan 12, 2007 8:44 pm

IowKitOpenDevice liefert 8978137891377040648 in der Rückgabe

Post by Mike_J »

Hallo zusammen

Ich versuche nun seit 3 Tagen ver2felt das IOW40 über VisualBasic (V-Studio Ver8) anzusteuern. Aber nun scheitere ich schon am IowKitOpenDevice - dieser liefert mir immer 8978137891377040648 als Rückgabewert. Was mache ich falsch?!
Der IOW selbst funktioniert, denn mit dem Testprogramm von Ralf Greinert kann ich das Teil einwandfrei ansteuern.

Wäre über einen Tip sehr dankbar.

Viele Grüße
Mike
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Einen 64-bit Wert? Da scheint irgendwas mit der Einstellung nicht hinzuhauen. Ist das etwa auch noch ein .net Projekt?
Mike_J
Posts: 7
Joined: Fri Jan 12, 2007 8:44 pm

Post by Mike_J »

ja, es ist ein .net projekt. Aber was kann ich denn da Falsch einstellen?!

Viele Grüße
Mike
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Von welchem Typ ist die angezeigte Variable? Es scheint mir ein 64-bit Integer zu sein.
Nach der Konvertierung zu Hex kommt 7C98C0D81000CD08 heraus. Der untere 32-Bit-Teil 1000CD08 sieht ganz gesund aus. Es kommt also der Handle (intern eine Adresse) auf den ersten gefundenen IOWarrior heraus.
es koennte sein das einfach falsch angezeigt wird.
Was passiert wenn man den Handle mit einer der IowKit-Funktionen benutzt?
Mike_J
Posts: 7
Joined: Fri Jan 12, 2007 8:44 pm

Post by Mike_J »

Beim Aufruf des Handles erhalte ich folgende Fehlermeldung

Code: Select all

PInvokeStackImbalance wurde erkannt.
Message: Ein Aufruf an die PInvoke-Funktion "IO_Test!WindowsApplication1.Module1::IowKitGetDeviceHandle" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.
Verstehen tue ich da allerdings nicht´s davon...

Viele grüße
Mike
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Dazu habe ich das hier gefunden.
viewtopic.php?t=341
Da scheint die Konversion von iow.bas nach VB.net schief zu gehen.

Schick mir mal das zugehoerige konvertierte VB File. Es heisst vermutlich IOW.vb. Ich hab zwar da auch keine Ahnung von den Einzelheiten, aber ich kann bestimmt trotzdem etwas herausbekommen.

Meine Email ist marquardt att codemercs dott com
Mike_J
Posts: 7
Joined: Fri Jan 12, 2007 8:44 pm

Post by Mike_J »

Ich hab das Programm nicht konvertiert sondern den VB6 Quelltext kopiert, und in .Net eingefügt. Beim Konvertieren sind gleich einige Fehlermeldungen erschienen, daher habe ich es gleich gelassen.
Habe Dir das Programm mal per mail geschickt, und damit die "mitlesenden" auch wissen worum es geht, hier nochmals eingefügt:

Form1:

Code: Select all

Public Class Form1
    
    ' IO-Warrior handles
    Dim iowHandles(IOWKIT_MAX_DEVICES) As Long
    ' Number of IOWs
    Dim numIows As Long
    ' Data buffer
    ' Basic data buffer is 5 bytes long: 1 byte for report id, 4 bytes for data
    Dim data(5) As Byte

    ' Number of bytes written
    'Dim nWritten As Long
    Dim nWritten As Long
    Dim Res As Long

    Private Sub WriteLEDs(ByVal Value As Byte)
        ' Number of bytes written
        Dim nWritten As Long
        ' Loop variable
        Dim I As Long

        ' Set up Report ID
        ' Report ID 0 is for writing to zero interface (16 or 32 IO-Warrior I/O pins)
        data(0) = 0
        For I = 0 To numIows - 1
            ' Set up bytes
            data(1) = &HFF
            data(2) = &HFF
            data(3) = &HFF
            data(4) = &HFF
            If IowKitGetProductId(iowHandles(I)) = IOWKIT_PID_IOW24 Then
                ' First byte is controlling standard LED
                data(1) = Value
                ' Write to IOW 24
                nWritten = IowKitWrite(iowHandles(I), IOW_PIPE_IO_PINS, data(0), 3)
            Else
                ' Fourth byte is controlling standard LEDs
                data(4) = Value
                ' Write to IOW 40
                nWritten = IowKitWrite(iowHandles(I), IOW_PIPE_IO_PINS, data(0), 5)
            End If
        Next I
    End Sub

    ' Blink all IOWs
    Private Sub ClearAllButton_Click()
        ' Clear all LEDs (negative logic)
        Call WriteLEDs(&HFF)
    End Sub

    Private Sub RandomButton_Click()
        ' Write random bits to LEDs
        Randomize()
        Call WriteLEDs(Int(256 * Rnd) And &HFF)
    End Sub

  


    ' Read something from IO-Warrior
    Private Sub ReadButton_Click()
        'Dim Res As Long
        Dim N As Long
        ' Perform a read
        ' Don't forget that we read report ID too
        ' So we have 5 bytes buffer
        ' Turn off all LEDs
        ' Unmask all input lines
        ' first byte is report ID
        data(0) = &O0
        ' first report byte
        data(1) = &HFF
        ' second report byte
        data(2) = &HFF
        ' third report byte
        data(3) = &HFF
        ' fourth report byte
        data(4) = &HFF
        ' Write to IO-Warrior
        If IowKitGetProductId(iowHandles(0)) = IOWKIT_PID_IOW24 Then
            N = 3
        Else
            N = 5
        End If
        nWritten = IowKitWrite(iowHandles(0), 0, data(0), N)
        ' Handle error
        If nWritten <> N Then
            ' You can use GetLastError() to get error code
            MsgBox("Cannot set input mask!", 0, "Error")
            Exit Sub
        End If
        ' After this write, all input lines are unmasked
        ' Set caption
        ReadLabel.Text = "Reading from IOW"
        ReadLabel.Refresh()
        ' Read from IO-Warrior
        Res = IowKitRead(iowHandles(0), 0, data(0), N)
        ' Check results
        If Res <> N Then
            ReadLabel.Text = "Read from IOW wrong?"
        Else
            ' Convert and set data
            TextVal1.Text = Hex$(data(1))
            TextVal2.Text = Hex$(data(2))
            If N = 5 Then
                TextVal3.Text = Hex$(data(3))
                TextVal4.Text = Hex$(data(4))
            Else
                TextVal3.Text = ""
                TextVal4.Text = ""
            End If
            ReadLabel.Text = "Read from IOW complete"
        End If
    End Sub

    ' Write value
    Private Sub WriteButton_Click()
        Dim Value As Byte
        Dim N As Long
        If IowKitGetProductId(iowHandles(0)) = IOWKIT_PID_IOW24 Then
            N = 3
        Else
            N = 5
        End If
        ' Report ID 0
        data(0) = 0
        ' Get values from text
        ' Note: we don't check values here
        ' so you'd better enter correct values
        Value = Val("&H" & TextVal1.Text)
        ' Set first report byte
        data(1) = Value
        Value = Val("&H" & TextVal2.Text)
        ' Set second report byte
        data(2) = Value
        If N = 5 Then
            Value = Val("&H" & TextVal3.Text)
            ' Set third report byte
            data(3) = Value
            Value = Val("&H" & TextVal4.Text)
            ' Set fourth report byte
            data(4) = Value
        End If
        ' Write to IOW
        Res = IowKitWrite(iowHandles(0), 0, data(0), N)
        ' Handle error
        If Res <> N Then
            ' You can get error code from GetLastError()
            MsgBox("Write to IOW failed!", 0, "Error")
        End If
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Dim I As Long
        Call ClearAllButton_Click()
        ' Close all IO-Warrior devices
        For I = 1 To numIows
            ' Close IO-Warrior device
            IowKitCloseDevice(iowHandles(I - 1))
        Next I
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim I As Long
        Dim S(18) As Byte
        Dim iLoop As Integer
        ' Initialize everything
        ' Open device
        iowHandles(0) = IowKitOpenDevice()
        ' Fail if can't open
        If iowHandles(0) = 0 Then
            ' Barf and exit from program
            MsgBox("Can not open device!", 0, "Error")
            End
        End If
        ' Get number of IO-Warrior devices in system
        numIows = IowKitGetNumDevs()
        ' Get all IO-Warrior handles
        For I = 2 To numIows
            iowHandles(I - 1) = IowKitGetDeviceHandle(I)
        Next I
        Call ClearAllButton_Click()
        I = IowKitGetSerialNumber(iowHandles(0), S(0))
        For iLoop = 0 To 18
            ReadLabel.Text = ReadLabel.Text & CStr(S(iLoop))
        Next

        ReadLabel.Text = "Serial number: " + ReadLabel.Text
        ReadLabel.Refresh()
    End Sub
End Class

Module 1:

Code: Select all


Module Module1
    ' Required kernel32 functions
    Public Declare Function GetLastError _
        Lib "kernel32" () _
    As Long

    ' IOW SDK V1.5

    ' IO-Warrior vendor & product IDs
    Public Const IOWKIT_VENDOR_ID As Long = &H7C0
    Public Const IOWKIT_VID As Long = IOWKIT_VENDOR_ID

    ' IO-Warrior 40
    Public Const IOWKIT_PRODUCT_ID_IOW40 As Long = &H1500
    Public Const IOWKIT_PID_IOW40 As Long = IOWKIT_PRODUCT_ID_IOW40

    ' IO-Warrior 24
    Public Const IOWKIT_PRODUCT_ID_IOW24 As Long = &H1501
    Public Const IOWKIT_PID_IOW24 As Long = IOWKIT_PRODUCT_ID_IOW24

    ' IO-Warrior PowerVampire
    Public Const IOWKIT_PRODUCT_ID_IOWPV1 As Long = &H1511
    Public Const IOWKIT_PID_IOWPV1 As Long = IOWKIT_PRODUCT_ID_IOWPV1
    Public Const IOWKIT_PRODUCT_ID_IOWPV2 As Long = &H1512
    Public Const IOWKIT_PID_IOWPV2 As Long = IOWKIT_PRODUCT_ID_IOWPV2

    ' IO-Warrior 56
    Public Const IOWKIT_PRODUCT_ID_IOW56 As Long = &H1503
    Public Const IOWKIT_PID_IOW56 As Long = IOWKIT_PRODUCT_ID_IOW56

    ' Max number of pipes per IOW device
    Public Const IOWKIT_MAX_PIPES As Long = 2

    ' pipe names
    Public Const IOW_PIPE_IO_PINS As Long = 0
    Public Const IOW_PIPE_SPECIAL_MODE As Long = 1

    ' Max number of IOW devices in system
    Public Const IOWKIT_MAX_DEVICES As Long = 16

    ' IOW Legacy devices open modes
    Public Const IOW_OPEN_SIMPLE As Long = 1
    Public Const IOW_OPEN_COMPLEX As Long = 2

    ' first IO-Warrior revision with serial numbers
    Public Const IOW_NON_LEGACY_REVISION = &H1010

    ' IO-Warrior low-level library API functions

    Public Declare Function IowKitOpenDevice _
       Lib "iowkit.dll" () _
     As Long


    Public Declare Sub IowKitCloseDevice _
        Lib "iowkit.dll" _
        (ByVal iowHandle As Long)

    Public Declare Function IowKitWrite _
        Lib "iowkit.dll" _
        (ByVal iowHandle As Long, _
         ByVal numPipe As Long, _
         ByRef buffer As Byte, _
         ByVal length As Long _
        ) _
    As Long

    Public Declare Function IowKitVersion Lib "iowkit.dll" () As String


    Public Declare Function IowKitRead Lib "iowkit.dll" _
        (ByVal iowHandle As Long, _
         ByVal numPipe As Long, _
         ByRef buffer As Byte, _
         ByVal length As Long _
        ) _
    As Long

    Public Declare Function IowKitReadNonBlocking _
        Lib "iowkit.dll" _
        (ByVal iowHandle As Long, _
         ByVal numPipe As Long, _
         ByRef buffer As Byte, _
         ByVal length As Long _
        ) _
    As Long

    Public Declare Function IowKitReadImmediate _
        Lib "iowkit.dll" _
        (ByVal iowHandle As Long, _
         ByRef Value As Long) _
    As Long

    ' Get number of IOW devices
    Public Declare Function IowKitGetNumDevs _
        Lib "iowkit.dll" () _
    As Long

    ' Get Nth IOW device handle
    Public Declare Function IowKitGetDeviceHandle _
        Lib "iowkit.dll" _
        (ByVal numDevice As Long) _
    As Long

    Public Declare Function IowKitSetLegacyOpenMode _
        Lib "iowkit.dll" _
        (ByVal openMode As Long) _
    As Long

    Public Declare Function IowKitGetProductId _
        Lib "iowkit.dll" _
        (ByVal iowHandle As Long) _
    As Long

    Public Declare Function IowKitGetRevision _
        Lib "iowkit.dll" _
        (ByVal iowHandle As Long) _
    As Long

    Public Declare Function IowKitGetThreadHandle _
        Lib "iowkit.dll" _
        (ByVal iowHandle As Long) _
    As Long

    Public Declare Function IowKitGetSerialNumber _
        Lib "iowkit.dll" _
        (ByVal iowHandle As Long, ByRef serialNumber As Byte) _
    As Long

    Public Declare Function IowKitSetTimeout _
        Lib "iowkit.dll" _
        (ByVal iowHandle As Long, ByVal TimeOut As Long) _
    As Long

    Public Declare Function IowKitSetWriteTimeout _
        Lib "iowkit.dll" _
        (ByVal iowHandle As Long, ByVal TimeOut As Long) _
    As Long

    Public Declare Function IowKitCancelIo _
        Lib "iowkit.dll" _
        (ByVal iowHandle As Long, _
         ByVal numPipe As Long) _
    As Long
End Module
Viele Grüße
Mike
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

In den naechsten Tagen machen wir ein Bugfix-Release des 1.5 APIs.
Die beiden Probleme mit abstuerzendem VB6 und nicht funktionierendem mehrfachen Aufruf von IowKitOpenDevice/IowKitCloseDevice sind geloest. Es war ein und das selbe Problem.

Es gibt neue C++ Beispiele und ein VB.net Beispiel.
Die HID-Komponente fuer Delphi wurde erweitert und das SimpleHIDWrite-Beispiel wurde den neuen Moeglichkeiten angepasst und verfeinert. Es ist jetzt ein nuetzliches Tool fuer die Erforschung unbekannter HID-Geraete.
Mike_J
Posts: 7
Joined: Fri Jan 12, 2007 8:44 pm

Post by Mike_J »

Mahlzeit

so, konnte es leider erst heute testen. das setzen der Ausgänge funktioniert einwandfrei, aber das Abfragen der Eingänge funktioniert nur 2-3mal, dabei liefert mir der IOW immer andere Werte, obwohl sich an den Pins nichts verändert, und dann stürzt das Programm an der Zeile

Code: Select all

Res = IowKitRead(iowHandles(0), 0, data(0), N)
ab. Ich muss dann das VisualStudio komplett beenden, neu starten, dann geht´s wieder 2-3mal.

Gibt es da nen Anhaltspunkt woran es liegen könnte?!


Viele Grüße
Mike
Admin
Site Admin
Posts: 50
Joined: Tue Nov 25, 2003 10:05 pm

Post by Admin »

Tip: Beschreibung von iowkitRead mal genau durchlesen.

Das programm stürzt nicht ab, es wartet auf Daten.
Mike_J
Posts: 7
Joined: Fri Jan 12, 2007 8:44 pm

Post by Mike_J »

hmmm, ja, aber steht dann "Keine Rückmeldung" im Task Manager?!

Gruß Mike
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Post by Christoph Jung »

ist gut möglich, dass dein Programm dann abschmiert. Kommt drauf an wie du das IowKitRead() aufrufst. Wenn du das in einer fortlaufenden Schleife machst oder mit Hilfe eines Timers, dann hängt sich das nach einiger Zeit auf, weil er mehrmals versucht Daten zu lesen, wo keine kommen und dann waretet.

Ich empfehle dir ReadImediate oder ReadNonBlocking oder du verwendest den IowKitTimeout (habs jetzt nicht vor mir liegen) um dein Problem zu lösen (ob nun mit Schleife, Timer oder Ohne).
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Admin
Site Admin
Posts: 50
Joined: Tue Nov 25, 2003 10:05 pm

Post by Admin »

IowKitRead() kann eine volle Blockade auslösen, das sieht dann soi aus als wenn das Programm hängt. Beim IOW40KIT oder IOW56KIT einfach mal die Taste drücken.
Post Reply