Ich habe ein Problem beim lesen mit der Funktion (IowKitReadImmediate).
Das Programm bleibt in der Funktion hängen. Das geschieht sporadisch nach einer unterschiedlichen Zahl von aufrufen, aber reproduzierbar.
Ich habe den IO-Warrior40 Version: V1.0.2.1R
IO-Warrior SDK Library V2 ( dll Version 1.5.0.0 )
Hat jemand ein ähnliches Problem schon mal gehabt?
Mein Programm: (Stark gekürzt)
//--------------------------------------------------------------------
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "iowkit.h"
#include <conio.h>
int Hardwareinitialisieren(IOWKIT_HANDLE *devHandle, IOWKIT_HANDLE *iows)
{
int return_wert;
int numIows;
return_wert = 0;
// Open device
*devHandle = IowKitOpenDevice();
if (*devHandle == NULL)
{
printf("Hardware defekt oder nicht angeschlossen!\n");
getch();
return_wert = 1;
}
// Get number of IOWs in system
numIows = IowKitGetNumDevs();
printf("%d IOWs in system\n", numIows);
// Get IOW handles
*iows = IowKitGetDeviceHandle(1);
IowKitSetWriteTimeout(*iows, 1000);
return return_wert;
}
//---------------------------------------------------------------------------------------
int main(void)
{
int i;
IOWKIT_HANDLE iows, devHandle;
ULONG bits;
BOOLEAN rc;
printf("\nIOW-Test");
printf("\n--------\n");
getch();
/*----*/ printf("vor Init\n");
if( Hardwareinitialisieren( &devHandle, &iows) == 0)
{
/*----*/ printf("nach Init\n");
for(i = 0 ; i < 100; i++)
{
/*----*/ printf("vor read\n");
rc = IowKitReadImmediate(iows, &bits);
/*----*/ printf("nach read %03d %01d -%08X\n", i, rc ? 1 : 0, bits);
}
IowKitCloseDevice(devHandle);
}
else
{
printf("\n---> Hardware FEHLER!!!\n");
}
getch();
return 0;
}
//---------------------------------------------------------------------------
Kann jemand weiterhelfen? Bin schon total verzweifelt.
Ich könnte auch das mitgeloggte USB Logfile zumailen.
MfG Olli
Fehler beim lesen
Moderator: Guido Körber
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Special Report
Hi,
ich habe schon ein wenig durch das Forum gewühlt, konnte dazu aber leider keine "detaillierte" Beschreibung finden, deshalb hier meine Frage :
Wie genau muss mein Code aussehen, wenn ich den aktuellen Status für einen IOWarrior56 über den Special Mode erhalten möchte?
Ich habe schon ein paar Variationen ausgetestet, die allerdings erfolglos waren.
Bevor ich also weiter rummache würde ich doch gerne mal genau verstehen was hier geschehen soll ^^
Teil meines C-Codes :
Mein Ziel ist es den Status auszulesen, und diese dem Bytefeld meines Reports zu übergeben.
Sinn und Zweck des ganzen soll sein, dass bei einem eventuellen Programmabsturz der aktuelle Stand wieder ausgelesen werden kann.
Windows initialisiert Variablen ja meistens(immer?) mit Nullen.
Aber prinzipiell interessiert mich erstmal wieso ich das mit dem Special Mode nicht gebacken bekomme :x
Vielen Dank schonmal für Eure Antworten.
Euer PinGuiN
ich habe schon ein wenig durch das Forum gewühlt, konnte dazu aber leider keine "detaillierte" Beschreibung finden, deshalb hier meine Frage :
Wie genau muss mein Code aussehen, wenn ich den aktuellen Status für einen IOWarrior56 über den Special Mode erhalten möchte?
Ich habe schon ein paar Variationen ausgetestet, die allerdings erfolglos waren.
Bevor ich also weiter rummache würde ich doch gerne mal genau verstehen was hier geschehen soll ^^
Teil meines C-Codes :
Code: Select all
LOW = 0xFF;
ioRep.ReportID = LOW;
IowKitWrite( pv_ioHandle, IOW_PIPE_SPECIAL_MODE, (PCHAR)&ioRep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitReadNonBlocking( pv_ioHandle, IOW_PIPE_SPECIAL_MODE, (PCHAR)&ioRep, IOWKIT56_SPECIAL_REPORT_SIZE);
Sinn und Zweck des ganzen soll sein, dass bei einem eventuellen Programmabsturz der aktuelle Stand wieder ausgelesen werden kann.
Windows initialisiert Variablen ja meistens(immer?) mit Nullen.
Aber prinzipiell interessiert mich erstmal wieso ich das mit dem Special Mode nicht gebacken bekomme :x
Vielen Dank schonmal für Eure Antworten.
Euer PinGuiN
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Klassischer Fehler.
Der Schreibbefehl ist zwar richtig, aber das IowKitReadNonBlocking geht immer schief.
Das ist eine Falle in die selbst ich schon gelaufen bin und ich habe die DLL geschrieben.
Das Problem ist das es mindestens eine Millisekunde dauert bis die Antwort von IOWarrior kommt. Bis dahin wurde IowKitReadNonBlocking bereits ausgefuehrt und liefert natuerlich die Antwort das kein Report vorhanden ist.
Es muss also IowKitRead verwendet werden.
Der Schreibbefehl ist zwar richtig, aber das IowKitReadNonBlocking geht immer schief.
Das ist eine Falle in die selbst ich schon gelaufen bin und ich habe die DLL geschrieben.
Das Problem ist das es mindestens eine Millisekunde dauert bis die Antwort von IOWarrior kommt. Bis dahin wurde IowKitReadNonBlocking bereits ausgefuehrt und liefert natuerlich die Antwort das kein Report vorhanden ist.
Es muss also IowKitRead verwendet werden.