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
IOWarrior 24 - Werden Reports verschluckt?
Moderator: Guido Körber
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: IOWarrior 24 - Werden Reports verschluckt?
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.
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.