Fehler beim lesen

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
Olli
Posts: 3
Joined: Tue Mar 21, 2006 9:51 am

Fehler beim lesen

Post by Olli »

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
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Bis jetzt hat sich dieser Fehler immer dem Debuggen entzogen.
Als vorlaeufiger Rat einfach die darunterliegende Special Mode Funktion 0xFF benutzen. Also mit IowKitWrite einen Report mit 0xFF in der ReportID schreiben und dann mit IowKitRead die Antwort lesen.
PinGuiN
Posts: 2
Joined: Sun Sep 09, 2007 4:09 am

Special Report

Post by PinGuiN »

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 :

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);
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
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

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.
PinGuiN
Posts: 2
Joined: Sun Sep 09, 2007 4:09 am

Post by PinGuiN »

Super, Danke für die schnelle Hilfe Robert!
Es klappt jetzt auch wunderbar...

Grüsse PinGuiN
Post Reply