IOW40 VB
Moderator: Guido Körber
IOW40 VB
Hey,
Benutze den IOW40 zusammen mit VB, Kommunikation passt, derzeit mache ich es folgendermassen:
- Über eine VB exe wird die Read Funktion ausgelösst und wartet dann auf einen Wert vom IOW40
- In VB ist es so das die READ sofort alles blockiert und immer auf einen Wert wartet und dann weitermacht
Meine Frage ist es möglich das wenn IOW40 etwas melden will er sich bei der Applikation meldet bzw. es reicht auch nur eine Meldung und meine Applikation geht daraufhin in die Read Funktion holt sich den Wert. Ist das möglich?
Danke
Benutze den IOW40 zusammen mit VB, Kommunikation passt, derzeit mache ich es folgendermassen:
- Über eine VB exe wird die Read Funktion ausgelösst und wartet dann auf einen Wert vom IOW40
- In VB ist es so das die READ sofort alles blockiert und immer auf einen Wert wartet und dann weitermacht
Meine Frage ist es möglich das wenn IOW40 etwas melden will er sich bei der Applikation meldet bzw. es reicht auch nur eine Meldung und meine Applikation geht daraufhin in die Read Funktion holt sich den Wert. Ist das möglich?
Danke
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Anscheinend funktioniert das readimmediate mehr schlecht als recht, habe es nun so gemacht:
- Hab bei der Read FUnktion ein TimeOut gesetzt von 1sek, so simuliere ich ein ReadImmediate
Bei ReadImmediate habe ich foldene Ausgaben bekommen:
- Wenn ich meinen IOW40 angeschlossen habe bekamm ich den Wert ß
- Nach drücken einer Taste hat sich der Wert auf 1307649 (?!?), habe ich dann eine weitere Taste gedrückt hat sich der ReadImmediate wert nicht geändert
In der Doku steht doch ReadImmediate liefert eine true/false zurück, was nun? bitte um Erklärung
- Hab bei der Read FUnktion ein TimeOut gesetzt von 1sek, so simuliere ich ein ReadImmediate
Bei ReadImmediate habe ich foldene Ausgaben bekommen:
- Wenn ich meinen IOW40 angeschlossen habe bekamm ich den Wert ß
- Nach drücken einer Taste hat sich der Wert auf 1307649 (?!?), habe ich dann eine weitere Taste gedrückt hat sich der ReadImmediate wert nicht geändert
In der Doku steht doch ReadImmediate liefert eine true/false zurück, was nun? bitte um Erklärung
Leider ist die Beschreibung von IowKitReadImmediate in der Datei "Windows DLL.pdf" leicht fehlerhaft. Ein Blick in die Quelldatei "readwrit.cpp" gibt da mehr Aufschluss.
Für IOWarrior mit einer Revisionsnummer > 1.0.1.0 (also alle IOWarrior mit Serialnumber) verwendet die Iowkit.dll den SpecialMode-Befehl :
"Getting current pin status" wie er im Datasheet zum IOWarrior Kapitel 5.10.4 beschrieben ist.
Sollte die Funktion IowKitReadImmediate also false liefern ist der Wert im 2. Argument (PDWORD value) nicht zu benutzen. Er enthält nicht den aktuellen Portstatus.
Nur wenn die Funktion true liefert enthält das 2. Argument den aktuellen Portstatus!
Insofern ist die Beschreibung in "Windows DLL.pdf"
Aber an dieser Stelle würde ich gerne selbst mal eine Frage loswerden über die ich mir schon länger Gedanken mache. Im Datasheet steht wie gesagt :
Grund für die Frage ist, das die function IowKitReadNow leider nicht überprüft, ob der vom IOWarrior gelesene Report tatsächlich die ReportID $FF im ersten Byte hat. Wenn sich also hier ein Report mit RC5-Kommandos, oder auch vom "SwitchMatrixMode" reinschmuggelt gibts natürlich Probleme.
Bzgl. der Fragen von mchopra:
Beim 2. Aufruf von ReadImmediate sollte sich das entsprechende Bit geändert haben.
Eberhard
Für IOWarrior mit einer Revisionsnummer > 1.0.1.0 (also alle IOWarrior mit Serialnumber) verwendet die Iowkit.dll den SpecialMode-Befehl :
"Getting current pin status" wie er im Datasheet zum IOWarrior Kapitel 5.10.4 beschrieben ist.
Der Returnwert true/false zeigt lediglich an ob das Schreiben des Reports zum IOWarrior UND das Lesen des Ergebnisses vom IOWarrior geklappt hat!To get the port status just send a report with ID
$FF to interface 1
This will result in the current pin status to be
returned immediately in an input report with ID
$FF
Sollte die Funktion IowKitReadImmediate also false liefern ist der Wert im 2. Argument (PDWORD value) nicht zu benutzen. Er enthält nicht den aktuellen Portstatus.
Nur wenn die Funktion true liefert enthält das 2. Argument den aktuellen Portstatus!
Insofern ist die Beschreibung in "Windows DLL.pdf"
einfach falsch.Return last value read from IO-Warrior pipe 0.
The function returns TRUE if a new value has arrived otherwise it returns FALSE and places the last
value read into value.
und außerdem wird gerade von dieser Funktion pipe 1 benutzt!The function can only read the I/O pins via pipe 0 so it does not need a numPipe parameter.
Aber an dieser Stelle würde ich gerne selbst mal eine Frage loswerden über die ich mir schon länger Gedanken mache. Im Datasheet steht wie gesagt :
trifft diese Aussage auch zu wenn ich z.B. bei einem IOWarrior24 den RC5-Mode aktiviert habe und zufällig gerade eine Kommando empfangen wurde? Werden diese zwei Ereignisse (Abfrage ReportId $FF, RC5-code) also in jedem Fall so serialisiert das auf jeden Fall der IOStatus auf die Abfrage geliefert wird?This will result in the current pin status to be
returned immediately in an input report with ID
$FF
Grund für die Frage ist, das die function IowKitReadNow leider nicht überprüft, ob der vom IOWarrior gelesene Report tatsächlich die ReportID $FF im ersten Byte hat. Wenn sich also hier ein Report mit RC5-Kommandos, oder auch vom "SwitchMatrixMode" reinschmuggelt gibts natürlich Probleme.
Bzgl. der Fragen von mchopra:
ein ß kommt mir seltsam vor als Wert für ein unsigned int- Wenn ich meinen IOW40 angeschlossen habe bekamm ich den Wert ß
Wie gesagt liefert IowKitReadImmediate den aktuellen Portstatus, keine Änderungen. Der Test müsste also folgendermaßen sein.- Nach drücken einer Taste hat sich der Wert auf 1307649 (?!?), habe ich dann eine weitere Taste gedrückt hat sich der ReadImmediate wert nicht geändert
Code: Select all
ReadImmediate aufrufen;
Taste drücken und festhalten;
ReadImmediate nochmal aufrufen;
Taste loslassen;
Eberhard
D.h. die readimmediate kann man nicht für foldendes Ereignis einsetzen:
- Ich habe eine VB exe die andauerend im loop läuft und readimmediate aufruft und das Ziel hat zu schaun ob neue Daten vorliegen, d.h. jemand hat eine Taste gedrückt geht das nun mit readimmediate?
so wie ich dich verstanden habe gibt readimmediate den JETZT Wert zurück, oder?
- Ich habe eine VB exe die andauerend im loop läuft und readimmediate aufruft und das Ziel hat zu schaun ob neue Daten vorliegen, d.h. jemand hat eine Taste gedrückt geht das nun mit readimmediate?
so wie ich dich verstanden habe gibt readimmediate den JETZT Wert zurück, oder?
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Das mit der internen Benutzung von "$FF to interface 1" fuer IowKitReadImmediate ist ein Designfehler.
Ich werde daher auf die Methode fuer alte IO-Warrior umstellen.
Das mit dem Test auf den korrekten Report $FF in der Antwort funktioniert auch nicht zuverlaessig.
Erstens wird dadurch ein anderer Report gestohlen und zweitens kann der Report verlorengehen. Dann aber verkeilt sich die Lesefunktion, da sie dann permanent auf einen $FF Report wartet, der nicht mehr kommen kann.
So jetzt nochmal die Erklaerung wie IowKitReadImmediate funktioniert (bzw funktionieren sollte).
Es wird ein intern ein Thread getartet, der permanent die Pipe 0 liest. Genaugenommen ist dies ein eigenes Geraet. Auf jeden Fall hat es einen separaten File-Handle und daher keinen Einfluss auf Pipe 1.
IowKitReadImmediate kommt immer sofort zurueck und sagt mit seinem Rueckgabewert an, ob sich der Wert gegenueber dem letzten Aufruf geaendert hat oder nicht.
Ich werde daher auf die Methode fuer alte IO-Warrior umstellen.
Das mit dem Test auf den korrekten Report $FF in der Antwort funktioniert auch nicht zuverlaessig.
Erstens wird dadurch ein anderer Report gestohlen und zweitens kann der Report verlorengehen. Dann aber verkeilt sich die Lesefunktion, da sie dann permanent auf einen $FF Report wartet, der nicht mehr kommen kann.
So jetzt nochmal die Erklaerung wie IowKitReadImmediate funktioniert (bzw funktionieren sollte).
Es wird ein intern ein Thread getartet, der permanent die Pipe 0 liest. Genaugenommen ist dies ein eigenes Geraet. Auf jeden Fall hat es einen separaten File-Handle und daher keinen Einfluss auf Pipe 1.
IowKitReadImmediate kommt immer sofort zurueck und sagt mit seinem Rueckgabewert an, ob sich der Wert gegenueber dem letzten Aufruf geaendert hat oder nicht.
Falls dein Programm nichts anderes tut als per ReadImmediate die Eingänge abzufragen (also kein RC5-Mode, keine Leseoperationen am IIC-Bus etc.) sollte das schon funktionieren, da in diesem Fall die "Getting current pin status"-Reports einzige Art von Daten sind, die der IOWarrior auf interface 1 schickt.mchopra wrote:D.h. die readimmediate kann man nicht für foldendes Ereignis einsetzen:
- Ich habe eine VB exe die andauerend im loop läuft und readimmediate aufruft und das Ziel hat zu schaun ob neue Daten vorliegen, d.h. jemand hat eine Taste gedrückt geht das nun mit readimmediate?
Den Test ob sich zwischen zwei per ReadImmediate-Aufrufen der Zustand der Eingänge verändert hat (Taste gedrückt oder losgelassen), mußt Du allerdings selbst implementieren.
Der return-wert TRUE bei ReadImmediate zeigt (unter der obigen Einschränkung) an, dass der SpecialModeBefehl "Getting current pin status" erfolgreich zum IOWarrior geschrieben und mit einem Report beantwortet wurde.
Der return-wert FALSE zeigt an, das entweder:
- das Schreiben des Reports "Getting current pin status" fehlgeschlagen ist
- das Lesen der Antwort vom IOWarrior fehlgeschlagen ist
- oder, das in einem der beiden zuvor genannten Fälle der interne timeout von jeweils 1000ms überschritten wurde.
Auf jeden Fall gilt: ein Rückgabewert von FALSE zeigt an das die Daten die nun im Parameter value stehen nicht benutzt werden können.
Ist natürlich ein Allgemeinplatz, aber bei Computern ist der Wert JETZT immer sehr relativ und der USB-Bus relativiert da sogar noch ein wenig mehr.mchopra wrote:
so wie ich dich verstanden habe gibt readimmediate den JETZT Wert zurück, oder?
Lässt man mal die Faktoren allg. Systemlast, Anzahl der Geräte am USB-Bus usw. außer Acht, sollte die Funktion ReadImmediate nach wenigen (geschätzt >16) Millisekunden ein Ergebnis liefern.
Die gute Nachricht ist jedoch hierbei, dass ReadImmediate nach etwa 1 Sekunde mit FALSE zurückkehrt wenn das Schreiben des Reports zum IOWarrior nicht geklappt hat und nach spätestens nach insgesamt 2 Sekunden mit FALSE zurückkehrt, falls der IOWarrior nicht antwortet.
Das erscheint natürlich ganz schön lang, aber soweit mir bekannt ist, hat ein USB-Gerät eigentlich sogar 5 Sekunden Zeit auf Befehle vom Usb-Host zum Gerät zu reagieren, bevor das Betriebssystem einen Timeout-Fehler am USB-Bus annimmt.
Eberhard
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Gut dann verlasse ich mich auf die Read Funktion, kann es sein das es bei dieser Funktion Speicherprobleme gibt, bei meiner Applikation muss ich die ReadFunktion über einen Zeitraum von 14 Stunden machen, bedeutet wenn ich einen Wert bekomme macht meine Applikation was und wenn der Befehl abgearbeitet ist geht sie zurück in den Read Modus, gibt es hier Erfahrungswerte,