Ich möchte eine dauerhaft laufende Applikation mit dem IOW56DG schreiben, die möglichst robust läuft.
In der Doku vom 8.Dez 2005 für die API V1.5 steht auf Seite 15 (Funktion IowKitSetTimeout):
"It is possible to lose reports with HID devices."
Was bedeutet das?
Hat es einen Einfluss auf meine Applikation, wenn ich IowKitWrite() und IowKitReadNonBlocking() benutze?
Verlorengehende Reports?!
Moderator: Guido Körber
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Verlorengehende Reports?!
Das ist nur ein Hinweis darauf, dass man Reports verlieren könnte. Das ist so wie "Wenn Sie das Feuerzeug beuntzen können Sie sich verbrennen".
Die Funktion selber soll einfach nur verhindern, dass wenn es zu diesem Fall kommt, dass Reports verloren gehen (durch irgendeinen Fehler am USB wie abziehen, Kurzschluss oder fehler im Leiterplattenlayout) das Programm selber nicht "einfriert". Die Funktione IowKitRead() wartet nämlich so lange, bis ein neuer Report vorhanden ist. Wenn man IowKitSetTimeout() auf z.B. 1 Sekunde stellt, dann wird der Lesevorgang nach 1 Sekunde abgebrochen und das Programm läuft weiter.
Bei IowReadNonBlocking() hat das keinen Einfluss, weil dort nicht gewartet wird. Dies kann dann aber zu Problemen führen, denn wenn man z.B. eine bestimmte Antwort auf einen Befehl erwartet kann es passieren, dass man nur Murks bekommt und nicht das, was man erwartet.
Bei IowKitWrite() hat die Funktion keinen Einfluss. Das Steht aber in der Doku zu IowKitSetTimeout(): "Set read I/O timeout in milliseconds." Für das Schreiben gibt es eine eigene Timeout-Funktion.
Die Funktion selber soll einfach nur verhindern, dass wenn es zu diesem Fall kommt, dass Reports verloren gehen (durch irgendeinen Fehler am USB wie abziehen, Kurzschluss oder fehler im Leiterplattenlayout) das Programm selber nicht "einfriert". Die Funktione IowKitRead() wartet nämlich so lange, bis ein neuer Report vorhanden ist. Wenn man IowKitSetTimeout() auf z.B. 1 Sekunde stellt, dann wird der Lesevorgang nach 1 Sekunde abgebrochen und das Programm läuft weiter.
Bei IowReadNonBlocking() hat das keinen Einfluss, weil dort nicht gewartet wird. Dies kann dann aber zu Problemen führen, denn wenn man z.B. eine bestimmte Antwort auf einen Befehl erwartet kann es passieren, dass man nur Murks bekommt und nicht das, was man erwartet.
Bei IowKitWrite() hat die Funktion keinen Einfluss. Das Steht aber in der Doku zu IowKitSetTimeout(): "Set read I/O timeout in milliseconds." Für das Schreiben gibt es eine eigene Timeout-Funktion.
Re: Verlorengehende Reports?!
Ich bin bei meinem Programm jetzt auf ein Problem gestoßen:
- in einer Endlosschleife wird ein I2C-Gerät angesteuert, indem zuerst ein Write (Register setzen) und danach ReadNonBlocking() gemacht wird (eben so lange, bis etwas gelesen wird).
-> Wenn ich das Programm zwischendurch abbreche - offenbar in der Zeit, in der das ReadNonBlocking() noch nix findet - kommt der IOW in einen "schlechten" Zustand.
-> beim nächsten Ausführen meines Programms bekomme ich scheinbar den lese-report heraus, den ich im zuvor abgebrochenen Prozess "verschenkt" habe.
-> Dadurch weitet sich der Fehler aus, so dass ich für jeden (x)-ten Aufruf die (x-1)-te Antwort herauskriege - also Müll.
Die einzige Lösung ist momentan, den Dongle erneut in die USB-Buchse zu stecken.
Gibt es vielleicht auch eine "nichtmanuelle" Lösung?
- in einer Endlosschleife wird ein I2C-Gerät angesteuert, indem zuerst ein Write (Register setzen) und danach ReadNonBlocking() gemacht wird (eben so lange, bis etwas gelesen wird).
-> Wenn ich das Programm zwischendurch abbreche - offenbar in der Zeit, in der das ReadNonBlocking() noch nix findet - kommt der IOW in einen "schlechten" Zustand.
-> beim nächsten Ausführen meines Programms bekomme ich scheinbar den lese-report heraus, den ich im zuvor abgebrochenen Prozess "verschenkt" habe.
-> Dadurch weitet sich der Fehler aus, so dass ich für jeden (x)-ten Aufruf die (x-1)-te Antwort herauskriege - also Müll.
Die einzige Lösung ist momentan, den Dongle erneut in die USB-Buchse zu stecken.
Gibt es vielleicht auch eine "nichtmanuelle" Lösung?
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Verlorengehende Reports?!
Ich würde empfehlen IowKitRead() Zu nutzen und nicht IowKitReadNonBlocking(). IowKitRead() Wartet doch bis ein neuer Report gesendet wird. Und bei I²C sollte immer ein Report zurückkommen, auch wenns nur der NAK-Report ist.
Man könnte noch vor der eigentlichen Leseroutine schaun ob noch was "da ist". Also den Müll aussieben.
Man könnte noch vor der eigentlichen Leseroutine schaun ob noch was "da ist". Also den Müll aussieben.
Re: Verlorengehende Reports?!
Genau so etwas suche ich.Christoph Jung wrote:[...] Man könnte noch vor der eigentlichen Leseroutine schaun ob noch was "da ist". Also den Müll aussieben.
Ich habe hier im Forum mal einen Codeschnipsel gesehen. Bei mir sieht das momentan so aus, leider funktioniert das bei mir nicht:
Code: Select all
void iow_i2c_drain_buffers(IOWKIT_HANDLE iowHandle)
{
iow_i2c_special_mode(iowHandle);
static IOWKIT56_SPECIAL_REPORT dummy;
do{
// wegwerfen
printf("iow i2c drain buffers: %i\n", dummy.Bytes[0]); // hier kommt stetig 0 heraus :-\
} while (IowKitReadNonBlocking(iowHandle, IOW_PIPE_SPECIAL_MODE, (char*) &dummy, IOWKIT56_IO_REPORT_SIZE));
}
void iow_i2c_special_mode(IOWKIT_HANDLE iowHandle){
// Setze auf Special Mode
IOWKIT56_SPECIAL_REPORT report;
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x01; // Choose I2C-Mode
report.Bytes[0] = 0x01; // Enable I2C-Mode
//report.Bytes[1] = 0x02; // I2C Speed 50kHz slow
report.Bytes[1] = 0x01; // I2C Speed 400kHz fast
//report.Bytes[1] = 0x00; // I2C Speed 100kHz Standard
report.Bytes[2] = 0x00; // Timeout 0 -> 128ms
IowKitWrite(iowHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT56_SPECIAL_REPORT_SIZE);
}
Re: Verlorengehende Reports?!
Okay, im Code war IOWKIT56_IO_REPORT_SIZE falsch :-) Es muss natürlich SPECIAL statt IO sein.
Offenbar funktioniert es jetzt ;-)
Offenbar funktioniert es jetzt ;-)
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Verlorengehende Reports?!
Der Teufel steckt im Detail.