IOWarrior 24 - Werden Reports verschluckt?

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
Eveon
Posts: 1
Joined: Thu Apr 18, 2013 5:37 pm

IOWarrior 24 - Werden Reports verschluckt?

Post by Eveon »

Hallo,
ich hätte da mal eine Frage.
Mein Programm soll die Zeit messen an der an P0.0 ein Reedkontakt geschlossen wurde.
Dazu verwende ich folgenden Code der auch problemlos funktioniert.

Hier der vereinfachte code.
public const int PIN_CAPTURE_TIMER = 0x2a;
public const int PIN_RISING = 0x08;
public const int OBSERVER_READ_TIMEOUT = 2000;


IntPtr handle = getFittingHandle();

//Timeout for Read
IOWarrior.Functions.IowKitSetTimeout(handle, MyConst.OBSERVER_READ_TIMEOUT);

//IIC abschalten damit auch P0.1 angesprochen werden kann
byte[] report = new byte[IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE];
report[0] = 0x01;
report[1] = 0x00;
uint ret = IOWarrior.Functions.IowKitWrite(handle, IOWarrior.Defines.IOW_PIPE_SPECIAL_MODE, report, IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE);

//Capturetimer disabeln
report = new byte[IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE];
report[0] = 0x28;
report[1] = 0x00;
ret = IOWarrior.Functions.IowKitWrite(handle, IOWarrior.Defines.IOW_PIPE_SPECIAL_MODE, report,
IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE);

//Beide Capturetimer enabeln (P0.0 und P0.1)
report = new byte[IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE];
report[0] = 0x28;
report[1] = 0x03;
ret = IOWarrior.Functions.IowKitWrite(handle, IOWarrior.Defines.IOW_PIPE_SPECIAL_MODE, report,
IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE);

//Endlosschleife um Werte zu lesen
while (! _cancel)
{
Application.DoEvents(); //damit das cancel gesetzt werden kann

//Auslesen
report = new byte[IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE];
ret = IOWarrior.Functions.IowKitRead(handle, IOWarrior.Defines.IOW_PIPE_SPECIAL_MODE, report,
IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE);
if (ret == IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE)
{
/*
* Nur Capturetimer reports beachten
*/
//Capturetimer
if (report[0] == PIN_CAPTURE_TIMER)
{
//nur rising edge beachten
if (report[1] == PIN_RISING)
{

Und hier werden dann die Werte des Capturetimers ausgewertet und weiterverarbeitet

}
}
}
else
{
//Read Timeout -> Flatline
}
}


//Capturetimer disabeln
report = new byte[IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE];
report[0] = 0x28;
report[1] = 0x00;
ret = IOWarrior.Functions.IowKitWrite(handle, IOWarrior.Defines.IOW_PIPE_SPECIAL_MODE, report,
IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE);

//Device schließen
IOWarrior.Functions.IowKitCloseDevice(handle);

Ich glaube mich zu erinnern in der Doku gelesen zu haben, dass Windows nur alle 8ms den USB-Client (also den IOWarrior) abfragt.
Meine Frage ist nun, was passiert wenn innerhalb der 8ms der Kontakt z.B. 2 mal geschlossen wurde?
Werden vom IOWarrior dann 2 Reports angelegt die in dem obigen Code dann ausgelesen werden können?
Wird ein Report „verschluckt“? Falls ja, überschreibt der 1. den 2.ten?
Falls ein Report verschluckt wird, gibt es eine Möglichkeit dies zu verhindern?

Vielen Dank an alle die mein Posting gelesen haben.
Ganz vielen Dank an alle die antworten.

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

Re: IOWarrior 24 - Werden Reports verschluckt?

Post by Christoph Jung »

Man kann den IO-Warrior auch schneller abfragen. Dann kommen aber glaub ich keine neuen Daten am System an.
8ms ist das Maximum vom Low-Speed USB soweit ich weiß. Ich bin jetzt aber nicht so sehr vertraut mit den USB-Spezifikationen.

Der Capture Timer Modus puffert 3 Flankenpaare pro Kanal. Das entnehme ich jedenfalls dem Datenblatt.
Also wenn in sehr kurzer Zeit 4 Flanken kommen und die Daten nicht ausgelesen wurde sind sie logischerweise verloren.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Post Reply