Verlorengehende Reports?!

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
thomasxy
Posts: 8
Joined: Thu Feb 09, 2012 4:27 pm

Verlorengehende Reports?!

Post by thomasxy »

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?
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Verlorengehende Reports?!

Post by Christoph Jung »

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.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
thomasxy
Posts: 8
Joined: Thu Feb 09, 2012 4:27 pm

Re: Verlorengehende Reports?!

Post by thomasxy »

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?
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Verlorengehende Reports?!

Post by Christoph Jung »

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.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
thomasxy
Posts: 8
Joined: Thu Feb 09, 2012 4:27 pm

Re: Verlorengehende Reports?!

Post by thomasxy »

Christoph Jung wrote:[...] Man könnte noch vor der eigentlichen Leseroutine schaun ob noch was "da ist". Also den Müll aussieben.
Genau so etwas suche ich.

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);
}

thomasxy
Posts: 8
Joined: Thu Feb 09, 2012 4:27 pm

Re: Verlorengehende Reports?!

Post by thomasxy »

Okay, im Code war IOWKIT56_IO_REPORT_SIZE falsch :-) Es muss natürlich SPECIAL statt IO sein.

Offenbar funktioniert es jetzt ;-)
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Verlorengehende Reports?!

Post by Christoph Jung »

Der Teufel steckt im Detail.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Post Reply