lesen mit iowkitread in io-warrior56

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
Rachid03
Posts: 1
Joined: Wed Apr 07, 2010 10:47 pm

lesen mit iowkitread in io-warrior56

Post by Rachid03 »

Hallo,

ich fange gerade an mich in die Grundlagen einzuarbeiten und komme an einer Stelle nicht weiter.
Das schreiben mit iowkitwrite klappt ohne Probleme, beim lesen mit iowkitread hänge ich fest.

Mein Code

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#include "windows.h"
#include "iowkit.h"


int main(void)
{
	// Deklaration

	IOWKIT_HANDLE ioHandle;	
	IOWKIT56_IO_REPORT report;
	ULONG res;
	

    
	
	// Gerätezugriff
	ioHandle = IowKitOpenDevice();

	if (ioHandle != NULL)
	{
X		res = IowKitRead(ioHandle, IOW_PIPE_IO_PINS, &report, IOWKIT56_IO_REPORT_SIZE);
		
		if (res != IOWKIT40_IO_REPORT_SIZE)
		{
			printf("Didn't read, handle error\n");
			IowKitCloseDevice(0);
		}

		else
		{
			printf("wert:%x\n", report);
			IowKitCloseDevice(0);
		}
	}
	
	else
	{
		IowKitCloseDevice(0);
		printf("ERROR: Geraet ist nicht angeschlossen\n");
	}
	
	system("PAUSE");
	return 0;
}
   
Beim debuggen habe ich festgestellt das er sich immer in Zeile X aufhängt und danach läuft er nicht mehr weiter.
Was mache ich falsch? Habe den Code aus der Dynamic Library pdf Datei. Ich arbeite mit einer 32 Bit version von Windows xp und habe die richtige dll Datei benutzt.
Mit iowkitreadnonblocking hatte ich auch keinen Erfolg.

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

Re: lesen mit iowkitread in io-warrior56

Post by Christoph Jung »

Solange keine Änderung anliegt bleibt das Programm bei IowKitRead() hängen. IowKitReadNonBlocking() wollte eigentlich funktionieren, da dort nicht auf ein Ergeniss gewartet wird.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: lesen mit iowkitread in io-warrior56

Post by friend-of-rq »

@Rachid03
Mit iowkitreadnonblocking hatte ich auch keinen Erfolg.
Bei "readnonblocking" musst Du die Report-ID nach jedem einlesen prüfen,
fragst Du z.B. zu früh ab und der IOW noch keine Daten geliefert,
ist im eingelesenem Report die (Report-ID = 0).
matl
Posts: 1
Joined: Wed Apr 21, 2010 12:55 pm

Re: lesen mit iowkitread in io-warrior56

Post by matl »

Hallo,

stehe grad vor den selben Problem.

Code: Select all

#include "math.h"
#include "mex.h"   //--This one is required
#include "windows.h" 
#include "iowkit.h"
#include "stdio.h"


void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
	// Deklaration
	IOWKIT_HANDLE ioHandle;	
	IOWKIT56_IO_REPORT report;
	ULONG res;

	// Gerätezugriff
	ioHandle = IowKitOpenDevice();

	// Überprüfung ob Gerät vorhanden ist
	if (ioHandle != NULL)
	{
		
     
			res = IowKitReadNonBlocking(ioHandle, IOW_PIPE_IO_PINS, &report, IOWKIT56_IO_REPORT_SIZE);
XX			

			if (res == 0)
	
			{
				printf("Didn't read, handle error\n");
				IowKitCloseDevice(0);
			}
		
			else
			{
				printf("wert: %x \n", report.bytes[0]);
				IowKitCloseDevice(0);
			}

		
	}
	
	else
	{
		IowKitCloseDevice(0);
		printf("ERROR: Geraet ist nicht angeschlossen\n");
	}
	return;
}
   
Kann mir einer bitte ein Beispiel zeigen. res liefert 0 -> also hat das lesen nicht funktioniert?
Was meinst du mit "zu früh"? Ich möchte einfach nur den Zustand der 2 Led's in Port 0 abfragen.
Also FF -> beide led's aus
FC -> beide led's leuchten

Nach den Einlesen muss ich in Zeile XX die Report-ID abfragen?
Das schreiben funktioniert bei mir auch ohne Probleme, also ist die Hardware in Ordnung.

Für ein einfaches Code Beispiel wäre ich sehr dankbar.
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: lesen mit iowkitread in io-warrior56

Post by friend-of-rq »

Hallo matl,

es gibt hier im Forum einige Beiträge die auf das Problem eingehen ...

Bei den IOWs gibt es zwei Kanäle (Pipe) über die man mit den IOWs kommunizieren kann
  • Pipe (0) Port direkt Steuerung / Abfrage
    Anzahl Byte je Report:
    IOW-24 = 3
    IOW-40 = 5
    IOW-56 = 8
    Byte(0) = (Report-ID) ist immer 0 beim schreiben und lesen
  • Pipe (1) spezial Funktionen
    Anzahl Byte je Report:
    IOW-24 = 8
    IOW-40 = 8
    IOW-56 = 64
    Byte(0) = (Report-ID) hat je nach Funktion einen Wert <> 0 (lesen und schreiben)
    Ist der Wert des Report-ID beim lesen = 0 , ist der eingelesene Report ungültig (leer)
Beide Kanäle (Pipe) schreiben Ihre Ergebnisse in je einem Stack(Stapelspeicher),
Diese können über "IowKitRead" oder "IowKitReadNonBlocking" aus gelesen werden.
Die ältesten Daten werden immer zuerst übermittelt, was auch zu Problemen führen kann, wenn man den Stack nicht zuvor leer geräumt hat.

"IowKitRead" liefert so lange ein Ergebnis(Report) bis der Stack leer ist, "IowKitRead" wartet dann so lange bis neue Daten in den Stack geschrieben werden oder ein Timeout den "IowKitRead" abbricht.... (Programm scheint solange zu hängen)

"IowKitReadNonBlocking" liefert immer einen Report, egal ob Daten im Stack vorhanden sind oder nicht.
Da "IowKitReadNonBlocking" auch ungültige Reports liefert, muss die Report-ID immer nach dem einlesen geprüft werden.
Pipe(1) Report-ID <> 0 Report gültig, über die Report-ID müssen die Daten einer Funktion zuordnen werden.
Pipe(1) Report-ID = 0 Report ungültig.

Bei Pipe(0) mach es keinen Sinn die Report-ID auszuwerten denn diese ist immer 0 !
Ein gültiger Datensatz ist über die Port(Daten)-Bytes auszuwerten, sind im Report alle Daten-Bytes = 0 , ist davon auszugehen das der Report ungültig ist.
Will man also die Ports über Pipe(0) auswerten sollte man immer ein Pin auf Hi lassen um gültige Reports zu erkennen.

Den Zustand der Ports kann man aber auch gezielt und sicher über Pipe(1) und Report-ID(255) abfragen.

Ich hoffe ich konnte alle Fragen beantworten ...

Gruss Ralf
Post Reply