IowKitOpenDevice liefert 8978137891377040648 in der Rückgabe
Moderator: Guido Körber
IowKitOpenDevice liefert 8978137891377040648 in der Rückgabe
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
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
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
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?
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?
Beim Aufruf des Handles erhalte ich folgende Fehlermeldung
Verstehen tue ich da allerdings nicht´s davon...
Viele grüße
Mike
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.
Viele grüße
Mike
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
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
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
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:
Module 1:
Viele Grüße
Mike
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
Mike
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
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.
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.
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 Zeileab. 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
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)
Gibt es da nen Anhaltspunkt woran es liegen könnte?!
Viele Grüße
Mike
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
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).
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).