Lesen vom Zustand des Pins

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
polj
Posts: 7
Joined: Mon May 30, 2005 4:19 pm

Lesen vom Zustand des Pins

Post by polj »

Hallo!
Kann jemand helfen :( ?!
Wir benutzen IO-Warrior40 V1.0.0.3 und möchten schreiben und danach lesen den Zustand des Pins (Ausgänge).Aber es kommt Fehler.
Danke im Voraus und hofe mich, dass jemand kann etwas wissen.
Tschuss!

//
// ioblink.cpp - Blinking LEDs sample
//

#include "stdafx.h"
#include "time.h"
#include "iowkit.h"

// Write simple value
BOOLEAN WriteSimple(IOWKIT_HANDLE devHandle, DWORD value)
{
IOWKIT_REPORT rep;

// Init report
rep.ReportID = 0;
rep.Value = 0xFFFFFFFF;
switch (IowKitGetProductId(devHandle))
{
// Write simple value to IOW40
case IOWKIT_PRODUCT_ID_IOW40:
rep.Bytes[3] = (UCHAR) value;
return IowKitWrite(devHandle, IOW_PIPE_IO_PINS,
(PCHAR) &rep, IOWKIT40_IO_REPORT_SIZE) == IOWKIT40_IO_REPORT_SIZE;
// Write simple value to IOW24
case IOWKIT_PRODUCT_ID_IOW24:
rep.Bytes[0] = (UCHAR) value;
return IowKitWrite(devHandle, IOW_PIPE_IO_PINS,
(PCHAR) &rep, IOWKIT24_IO_REPORT_SIZE) == IOWKIT24_IO_REPORT_SIZE;
default:
return FALSE;
}
}

int main(int argc, char* argv[])
{
IOWKIT_HANDLE iows[IOWKIT_MAX_DEVICES];
int i;
DWORD bits;
int numIows;
IOWKIT_REPORT rep;
WCHAR sn[9];
BOOLEAN rc;
DWORD pid;
IOWKIT_HANDLE devHandle;


// Open device
devHandle = IowKitOpenDevice();
if (devHandle == NULL)
{
printf("Failed to open device\n");
goto out;
}
// Get number of IOWs in system
numIows = IowKitGetNumDevs();
printf("%d IOWs in system\n", numIows);
// Get all IOW handles
for (i = 0; i < numIows; i++)
{
// Get device handle and init object
iows = IowKitGetDeviceHandle(i + 1);
// Get serial number
IowKitGetSerialNumber(iows, sn);
pid = IowKitGetProductId(iows);
printf("%d PID %x, S/N \"%ws\"\n", i + 1, pid, sn);
}
// Init report
// Report ID 0 is for writing to 32 input/output pins



printf("set LEDs...\n");

//Set IowKitSetTimeout
rc=IowKitSetTimeout(iows[0],1000);
if (!rc) printf("Cannot set Timeout, err %d\n", GetLastError());

//Set IowKitSetWriteTimeout
rc=IowKitSetWriteTimeout(iows[0],1000);
if (!rc) printf("Cannot set WriteTimeout, err %d\n", GetLastError());


// Set LEDs
rep.ReportID = 0;
rep.Value=0xffffffff;
rc=IowKitWrite(iows[0],0,(PCHAR) &rep,5);
if (!rc) printf("IowKitWrite failed, err %d\n", GetLastError());

rc=IowKitReadImmediate(iows[0], &bits);
if (!rc) printf("IowKitReadImmediate failed, err %d\n", GetLastError());
printf("Read: %x\n",bits);

rc=IowKitReadImmediate(iows[0], &bits);
if (!rc) printf("IowKitReadImmediate failed, err %d\n", GetLastError());
printf("Read: %x\n",bits);

// Write to simple endpoint
// rc = WriteSimple(iows[0], bits);
// Check for error
// if (!rc) printf("Cannot writesimple, err %d\n", GetLastError());


printf("Blinking complete\n");
// Set LEDs off
for (i = 0; i < numIows; i++)
{
// Write to simple endpoint
// WriteSimple(iows, 0xFFFFFFFF);
// WriteSimple(iows, 0xFFFFFFFF);
}
// Read immediate
rc = IowKitReadImmediate(iows[0], &bits);
printf("ReadImm(): rc %d bits %x\n", rc, bits);
// Close device
IowKitCloseDevice(devHandle);
out:

return 0;
}
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Ich kann den Fehler mit dem originalen IOBlink.exe nachvollziehen.
Es ist soweit erkennbar ein Fehler in iowkit.dll wenn auf einen IO-Warrior mit dieser alten Firmware geschrieben wird.
Ich werde wohl mal Debuggen muessen.Der Fehler tritt allerdings nicht bei jedem Schreiben auf.
polj
Posts: 7
Joined: Mon May 30, 2005 4:19 pm

Post by polj »

Vielen Dank für schnelle Antwort! :D
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Also ich habe keine Fallunterscheidung fuer alte Firmware beim Schreiben gefunden.
Als ich eben im originalen ioblink.cpp

Code: Select all

	// Get all IOW handles
	for (i = 0; i < numIows; i++)
	{
		// Get device handle and init object
		iows[i] = IowKitGetDeviceHandle(i + 1);
		// Get serial number
		IowKitGetSerialNumber(iows[i], sn);
		pid = IowKitGetProductId(iows[i]);
		printf("%d PID %x, S/N \"%ws\"\n", i + 1, pid, sn);

		IowKitSetWriteTimeout(iows[i], 1000);
	}
das IowKitSetWriteTimeout ergaenzt habe, begann das Beispiel mit einem alten IOWarrior zu funktionieren.
Das scheint ein ganz gemeiner Bug zu sein, da ja die fehlerhafte Source auch IowKitSetWriteTimeout aufruft.
Bitte mal ausprobieren ob es hilft das IowKitSetWriteTimeout in die Schleife zu setzen.
polj
Posts: 7
Joined: Mon May 30, 2005 4:19 pm

Post by polj »

Hallo,
ich habe etwas ausprobiert.Ich habe im Forum viele Themas darüber gelesen und ich habe nicht verstanden, ob man kann sich auf diese Funktion ReadImmediate verlassen.
Ich mache das zu erstem Mal, deswegen bemühe ich mich diesen fertigen Beispiel zu benutzen und probiere zu verstehen.
Es kommt Fehlermeldung "err.0" Wie kann man das deuten??
Und noch eines. Wenn ich Debug starte, /nicht Ausführen/..- es kommt Meldung "nicht abgefragte Ausnahme in ioblink.exe(NTDLL.DLL):0xC0000008:Invalid Handle"
oder anderes gesagt in Debug Fenster kommt "Thread 0x7C wurde mit Code 0 (0x0) beendet.
Thread 0x400 wurde mit Code -1073741816 (0xC0000008) beendet.
Das Programm "D:\SDK\Windows\Samples\Simple IO\C\Release\ioblink.exe" wurde mit Code -1073741816 (0xC0000008) beendet.
"
Das spricht mir nichts.Kann jemand mir das erklären?Bitte! :)

Danke!


//
// ioblink.cpp - Blinking LEDs sample
//

#include "stdafx.h"
#include "time.h"
#include "iowkit.h"

// Write simple value
BOOLEAN WriteSimple(IOWKIT_HANDLE devHandle, DWORD value)
{
IOWKIT_REPORT rep;

// Init report
rep.ReportID = 0;
rep.Value = 0x00000000;
switch (IowKitGetProductId(devHandle))
{
// Write simple value to IOW40
case IOWKIT_PRODUCT_ID_IOW40:
rep.Bytes[3] = (UCHAR) value;
return IowKitWrite(devHandle, IOW_PIPE_IO_PINS,
(PCHAR) &rep, IOWKIT40_IO_REPORT_SIZE) == IOWKIT40_IO_REPORT_SIZE;
// Write simple value to IOW24
case IOWKIT_PRODUCT_ID_IOW24:
rep.Bytes[0] = (UCHAR) value;
return IowKitWrite(devHandle, IOW_PIPE_IO_PINS,
(PCHAR) &rep, IOWKIT24_IO_REPORT_SIZE) == IOWKIT24_IO_REPORT_SIZE;
default:
return FALSE;
}
}

int main(int argc, char* argv[])
{
IOWKIT_HANDLE iows[IOWKIT_MAX_DEVICES];
int i,j;
ULONG bits, res;
int numIows;
IOWKIT_REPORT rep;
BOOLEAN rc;
DWORD pid;
IOWKIT_HANDLE devHandle;


// Open device
devHandle = IowKitOpenDevice();
if (devHandle == NULL)
{
printf("Failed to open device\n");
goto out;
}

// Get number of IOWs in system
numIows = IowKitGetNumDevs();
printf("%d IOWs in system\n", numIows);

// Get all IOW handles
for (i = 0; i <= numIows; i++)
{
// Get device handle and init object

iows = IowKitGetDeviceHandle(i+1);

pid = IowKitGetProductId(iows);
printf("%d PID %x\n", i+1, pid);

// Set read timeout to 1000 ms
IowKitSetTimeout(iows,1000);
}

// Init report
// Report ID 0 is for writing to 32 input/output pins

printf("set LEDs...\n");

if (!rc) printf("Cannot set Timeout, err %d\n", GetLastError());

//Set IowKitSetWriteTimeout
rc=IowKitSetWriteTimeout(iows[0],1000);
if (!rc) printf("Cannot set WriteTimeout, err %d\n", GetLastError());


// Set LEDs
rep.ReportID = 0;
rep.Value=0x0000FF00;
rc=IowKitWrite(iows[0],0,(PCHAR) &rep,5);
if (!rc) printf("IowKitWrite failed, err %d\n", GetLastError());

rc=IowKitReadImmediate(iows[0], &bits);
if (!rc) printf("IowKitReadImmediate failed, err %d\n", GetLastError());
printf("neue Daten \n");
printf("Read: %x\n",&bits);


// Write to simple endpoint
rc = WriteSimple(iows[0], bits);
// Check for error
if (!rc) printf("Cannot writesimple, err %d\n", GetLastError());


printf("Blinking complete\n");


// Set LEDs off
for (i = 0; i < numIows; i++)
{
// Write to simple endpoint
WriteSimple(iows, 0xFFFFFFFF);
// WriteSimple(iows, 0xFFFFFFFF);
}


// Read immediate

rc=IowKitReadImmediate(iows, &bits);
if (rc) printf("Neue Daten, err %d\n", GetLastError());
res=IowKitRead(iows,0,(PCHAR)&rep,5);
printf("Read():res%d bits%x\n",res,bits);
//printf("ReadImm():rc %d bits %x\n", rc, bits);
// Close device
IowKitCloseDevice(devHandle);
out:

return 0;
}
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Hallo polj,
an welcher Stelle kommt denn diese Fehlermeldung:
polj wrote: Es kommt Fehlermeldung "err.0" Wie kann man das deuten??
schon beim Schreiben oder erst bei Aufruf von ReadImmediate?

Eberhard
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Ich saege gerade an der DLL. Die interne Funktionsweise ist deutlich unbefriedigend. Das kann aber noch ein bischen dauern bis das stabil ist.

BTW bitte mit Code Tags um die Sourcen posten.
polj
Posts: 7
Joined: Mon May 30, 2005 4:19 pm

Post by polj »

Hallo wayoda,
das kommt nach Ausführen von .exe
  • 1 IOWs in system
    1 PID 1500
    2 PID 0
    set LEDs...
    Cannot set Timeout, err 0
    IowKitReadImmediate failed, err 0
    neue Daten
    Read: 12ff34
    Blinking complete
    Read():res0 bits1000cd48
    Press any key to continue

Code: Select all

// Set read timeout to 1000 ms 
IowKitSetTimeout(iows[i],1000); 
} 

// Init report 
// Report ID 0 is for writing to 32 input/output pins 
printf("set LEDs...\n"); 
if (!rc) printf("Cannot set Timeout, err %d\n", GetLastError()); 

//Set IowKitSetWriteTimeout 
rc=IowKitSetWriteTimeout(iows[0],1000); 
if (!rc) printf("Cannot set WriteTimeout, err %d\n", GetLastError()); 

// Set LEDs 
rep.ReportID = 0; 
rep.Value=0x0000FF00; 
rc=IowKitWrite(iows[0],0,(PCHAR) &rep,5); 
if (!rc) printf("IowKitWrite failed, err %d\n", GetLastError()); 

rc=IowKitReadImmediate(iows[0], &bits); 
if (!rc) printf("IowKitReadImmediate failed, err %d\n", GetLastError()); ;
1.Ich habe probiert diese IowKitSetTimeout in der und hinaus Schleife einbetten, aber es ist egal
2.Beim ersten Aufruf von ReadImmediate
Danke!
polj
Posts: 7
Joined: Mon May 30, 2005 4:19 pm

Post by polj »

help!
Jetzt habe ich anderse Problem.Ich habe fast nichts geändert und bekomme "ioblink.exe hat ein Problem festgestellt und muss beendet werden"
Die Ausführung stoppt bist "Set LEDs", d.h. jetzt kann sogar nicht schreiben??!! :?
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Es nuetzt nichts mich mit Updates des Problems zu ueberschuetten.
Ich schreibe im Augenblick die DLL heftig um. Es sind konzeptionelle Fehler in der DLL, die raus muessen.
Das kann ein paar Tage dauern.
polj
Posts: 7
Joined: Mon May 30, 2005 4:19 pm

Post by polj »

Wird auch Problem, dass wir IO-Warrior40 V1.0.0.3 benutzen?Brauchen wir neuere Version von IOW40?
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Nein, im Gegenteil ich bin gerade dabei der DLL auch die Fallunterscheidung von alten und neuen IO-Warriors abzugewoehnen.
Das Problem ist das IO-Pins und Special Mode Functions als zwei verschiedene Geraete erscheinen. Die Zusammenfuehrung erfolgt bisher ueber die Seriennummer, die nur bei den neuen IO-Warriors gesetzt ist.
Ich werde jetzt das Config Manager API benutzen und darueber den Zusammenhang zwischen den beiden Geraeten eines IO-Warriors herstellen.
Damit bleibt als Unterschied zwischen alt und neu nur die Anzahl unterstuetzter Special Mode Functions.
Zusaetzlich werde ich Lesen und Schreiben ueber getrennte File Handles machen und damit weitere potentielle Probleme der DLL erlegen.
Im Prinzip laeuft es darauf hinaus es wie in meiner Delphi-HID-Komponente zu machen :-)
Post Reply