Lesethreads lesen nichts unter Windows

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
hiasl
Posts: 26
Joined: Tue Jul 25, 2006 9:58 am

Lesethreads lesen nichts unter Windows

Post by hiasl »

Hallo,

ich habe folgenden Lesethread, jeweils einen pro iowarrior. Obwohl sDevs korrekt gefüllt sind, liest die Funktion 0 bytes. Leider schweigt sich die Doku und die Header darüber aus, welche Fehler passieren können.

UINT ReaderThreadFunc(LPVOID pParam) {
int sId = (int) pParam;
ULONG readValue;
while (1) {
int ret = IowKitRead(sDevs[sId], IOW_PIPE_IO_PINS, (PCHAR) &readValue, sizeof(ULONG));
int err = GetLastError();

printf("thread %d read %d bytes value %d %d\n", sId, ret, readValue, err);
}
AfxEndThread(0);
}

Folgende Ausgabe erhalte ich:
thread 0 read 0 bytes value -858993460 1460
thread 1 read 0 bytes value -858993460 1460
thread 0 read 0 bytes value -858993460 87
thread 0 read 0 bytes value -858993460 87
thread 0 read 0 bytes value -858993460 87
thread 1 read 0 bytes value -858993460 87
thread 0 read 0 bytes value -858993460 87
thread 1 read 0 bytes value -858993460 87

Noch eine weitere Anmerkung: IowKitRead blockiert nicht immer, sondern kehrt sofort zurück ohne was gelesen zu haben. Ich erhalte dann endlos viele Ausgaben wie oben...



Ich verwende das aktuelle SDK.

Für einen Tipp wäre ich dankbar.

Gruß
Matthias
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Es laeuft bereits ein Lesethread auf das Geraet. Besser IowKitReadNonBlocking verwenden.

Die Funktion wird auch falsch verwendet. Es kommt kein DWORD von Device.
Es kommt ein Report. Beim IOWarrior 24 mit 3 Bytes, beim IOWarrior 40 mit 5 Bytes und beim IOWarrior 56 mit 8 Bytes.
Wenn also dieser Call nicht auf einen IOWarriro 24 angewendet wird, so scheitert er immer, da der angegebene Puffer zu klein ist um auch nur einen Report zu fassen.
hiasl
Posts: 26
Joined: Tue Jul 25, 2006 9:58 am

Post by hiasl »

Ist mit dem Lesethread mein eigener oder der aus dem Treiber gemeint? Letzteres hat mit mir ja nichts zu tun. Da ich mehrere Geräte überwachen muss und ich nicht einen einzelnen Callback für alle Geräte registrieren kann, muss ich das über mehrere eigene Threads lösen. Pollen in einem einzigen Thread über alle Geräte ist ja keine Lösung, wenn die schon Ereignisse erzeugen. Das führt ja das Ereignis-Prinzip ad absurdum.

Die der Windows SDK beigefügte Anleitung ist auf v1.4 versioniert.
Last edited by hiasl on Thu Feb 15, 2007 2:54 pm, edited 1 time in total.
hiasl
Posts: 26
Joined: Tue Jul 25, 2006 9:58 am

Post by hiasl »

Das hatte ich noch vergessen. Ich habe die Funktion wie folgt abgeändert:

int sId = (int) pParam;
CHAR readValue[8];
while (1) {
int ret = IowKitRead(sDevs[sId], IOW_PIPE_IO_PINS, readValue, sizeof(readValue));
int err = GetLastError();
printf("thread %d read %d bytes value %s %d\n", sId, ret, readValue, err);
}

Jetzt ist der Puffer in jedem Fall groß genug.
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Kann ich die Sourcen bekommen? marquardt att codemercs dott com
Bitte gezippt und ohne das ebenso grosse wie unsinnige .ncb File.

Selber ausprobieren funktioniert doch besser als kleine Codeausschnitte anzustarren.
Post Reply