Lesen mit IOW56 unter cBuilder6
Moderator: Guido Körber
Lesen mit IOW56 unter cBuilder6
Hallo Gemeinde,
ich versuche mit dem CBuilder den Zustand der Ports zu lesen und bekomme es einfach nicht hin. Schreiben hingegen ist kein Problem das klappt.
Hat jemand vlt. ein paar Zeilen Code, wie ich mit aus dem IOW56 etwas auslese?
Danke Gruß
Manfred
ich versuche mit dem CBuilder den Zustand der Ports zu lesen und bekomme es einfach nicht hin. Schreiben hingegen ist kein Problem das klappt.
Hat jemand vlt. ein paar Zeilen Code, wie ich mit aus dem IOW56 etwas auslese?
Danke Gruß
Manfred
-
- Posts: 389
- Joined: Sun Feb 13, 2005 1:22 pm
- Location: Gerblingerode / Duderstadt
- Contact:
Re: Lesen mit IOW56 unter cBuilder6
Hallo n_Bahner,
ich habe zwar keinen Plan von CBuilder aber vielleicht kann ich Dir auch so helfen.
Schreibern der Ports bekommst Du hin, als über Pipe(Interface)-0 (8-Byte)
Dann schicke über Pipe(Interface)-1 einen Report mit der ID (FF) Byte(0)=FF, Byte(1) bis Byte(63) =0 (beachte dort werden 64-Byte versendet)
Darauf hin sendet die DLL den aktuellen Status auf pipe(Interface)-1 ebenfalls mit 64Byte und
der Report ID (FF) Byte(0)=FF, Byte(1)=Port0, Byte(2)=Port1 ... zurück, den Du mit "IowKitRead" dann einlesen kannst.
Gruss Ralf
ich habe zwar keinen Plan von CBuilder aber vielleicht kann ich Dir auch so helfen.
Schreibern der Ports bekommst Du hin, als über Pipe(Interface)-0 (8-Byte)
Dann schicke über Pipe(Interface)-1 einen Report mit der ID (FF) Byte(0)=FF, Byte(1) bis Byte(63) =0 (beachte dort werden 64-Byte versendet)
Darauf hin sendet die DLL den aktuellen Status auf pipe(Interface)-1 ebenfalls mit 64Byte und
der Report ID (FF) Byte(0)=FF, Byte(1)=Port0, Byte(2)=Port1 ... zurück, den Du mit "IowKitRead" dann einlesen kannst.
Gruss Ralf
Re: Lesen mit IOW56 unter cBuilder6
Hallo Friend of rq,
danke erst mal für die Antwort. Bin halt leider kein versierter Programmierer und verstehe Deine Antwort so, dass ich sie auch umsetzen könnte.
Hier mal mein Code mit dem ich die Ports setze:
Zum lesen hatte ich den Weg mit IowKitRead gesucht, aber erfolglos.
vielleicht hat hier jemand Plan oder eine Hilfestellung, die Anfänger wie ich versteht :-)
Danke
danke erst mal für die Antwort. Bin halt leider kein versierter Programmierer und verstehe Deine Antwort so, dass ich sie auch umsetzen könnte.
Hier mal mein Code mit dem ich die Ports setze:
Code: Select all
IOWKIT_HANDLE ioHandle;
IOWKIT56_IO_REPORT Report;
IOWKIT56_IO_REPORT Report1;
ioHandle = IowKitOpenDevice();
Report.Bytes[0] = 0x0F;
Report.Bytes[1] = 0x1F;
Report.Bytes[2] = 0x2F;
Report.Bytes[3] = 0x3F;
Report.Bytes[4] = 0x4F;
Report.Bytes[5] = 0xFF;
Status = IowKitWrite(ioHandle, IOW_PIPE_IO_PINS,
(PCHAR)&Report, IOWKIT56_IO_REPORT_SIZE);
Code: Select all
String result;
IOWKIT56_SPECIAL_REPORT rep56;
IOWKIT56_IO_REPORT rep56io;
IOWKIT_HANDLE ioHandle;
BYTE puffer = 0x00;
IowKitWrite(ioHandle, IOW_PIPE_IO_PINS, (PCHAR) &rep56io, IOWKIT56_IO_REPORT_SIZE);
memset(&rep56, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
Edit4->Text = rep56.Bytes;
Danke
- Christoph Jung
- Posts: 673
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Lesen mit IOW56 unter cBuilder6
Zum lesen sollte man schon die richtige Funktion nutzen. IowKitRead() wäre da wohl sehr hilfreicht.
Auch sollte man die ReportID immer mitsenden, auch wenn diese "nur" 0x00 ist.
Das memset ist dafür da, dass die Variable mit einer bestimmten "sache" beschrieben wird.
Wenn das nach dem Read kommt und dann die auswertung ist es immer in diesem fall 0x00.
richtig zum lesen wäre folgendes:
Auch sollte man die ReportID immer mitsenden, auch wenn diese "nur" 0x00 ist.
Das memset ist dafür da, dass die Variable mit einer bestimmten "sache" beschrieben wird.
Wenn das nach dem Read kommt und dann die auswertung ist es immer in diesem fall 0x00.
richtig zum lesen wäre folgendes:
Code: Select all
String result;
IOWKIT56_SPECIAL_REPORT rep56;
IOWKIT56_IO_REPORT rep56io;
IOWKIT_HANDLE ioHandle;
BYTE puffer = 0x00;
ioHandle = IowKitOpenDevice(); //Man muss auch schon ein Handle haben. Falls das irgendwo anders Global ist, dann hier auskommentieren
//lesen von Pipe 0 (IO-Ports)
memset(&rep56io, 0x00, OWKIT56_IO_REPORT_SIZE);
IowKitRead(ioHandle, IOW_PIPE_IO_PINS, (PCHAR) &rep56io, IOWKIT56_IO_REPORT_SIZE);
Edit4->Text = rep56io.Bytes[0]; //die Bytes sind verteilt, also muss man sich das noch zusammenstückeln
Last edited by Christoph Jung on Thu Jul 16, 2009 12:39 pm, edited 1 time in total.
Software developer
-
- Site Admin
- Posts: 2878
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: Lesen mit IOW56 unter cBuilder6
Im zweiten Beispiel wird geschrieben und nicht gelesen?!?
Re: Lesen mit IOW56 unter cBuilder6
Ja, das 2. Beispiel war natürlich Unfug, da wollte ich was anderes reinkopieren.
Im Wesentlichen hatte ich es auch so, aber
bringt als Ergebnis halt immer 0. Ich denke "stückeln" könnte ich mir das schon aber dazu brauche ich halt Daten.
Im Wesentlichen hatte ich es auch so, aber
Code: Select all
Edit4->Text = rep56io.Bytes[0];
-
- Site Admin
- Posts: 2878
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: Lesen mit IOW56 unter cBuilder6
Da nicht klar ist wie die Daten gelesen werden kann man dazu keine Antwort liefern.
- Christoph Jung
- Posts: 673
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Lesen mit IOW56 unter cBuilder6
hier die Routine, wie ich sie bisher habe:
Code: Select all
void __fastcall TForm1::Button11Click(TObject *Sender)
{
IOWKIT56_SPECIAL_REPORT rep56;
IOWKIT56_IO_REPORT rep56io;
IOWKIT_HANDLE ioHandle;
BYTE puffer = 0x00;
if(ioHandle != NULL)
{
rep56io.ReportID = 0x00;
rep56io.Bytes[0] = 0x00;
rep56io.Bytes[1] = 0x00;
rep56io.Bytes[2] = 0x00;
rep56io.Bytes[3] = 0x00;
rep56io.Bytes[4] = 0x00;
rep56io.Bytes[5] = 0xAA;
IowKitWrite(ioHandle, IOW_PIPE_IO_PINS, (PCHAR) &rep56io, IOWKIT56_IO_REPORT_SIZE);
memset(&rep56, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
for (int i=0;i<7;i++)
{
memset(&rep56, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
rep56.ReportID = 0xFF;
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (PCHAR) &rep56, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(ioHandle, IOW_PIPE_SPECIAL_MODE, (PCHAR) &rep56, IOWKIT56_SPECIAL_REPORT_SIZE);
puffer = rep56.Bytes[i];
ListBox->Items->Add(puffer);
}
}
else
ListBox->Items->Add("Error");
}
- Christoph Jung
- Posts: 673
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Lesen mit IOW56 unter cBuilder6
Die Schleife in der Leseroutine ist falsch. Es genügt, wenn einmal der Write-/ und Read-Befehl gestartet wird.
Der Inhalt von rep56.Bytes[] ist ein UCHAR. Falls es nötig sein sollte muss es für eine Listbox noch in einen CString umgewandelt werden.
Passiert denn überhaupt was beim aufrufen der Leseroutine? Bleibt das Programm stehen? schreibt er irgendwas in die Listbox?
Und nebenbei: Wo wird IowKitOpenDevice() aufgerufen?
Ich seh zwar, dass ein IOWKIT_HANDLE vorhanden ist, aber ohne ein OpenDevice wird sich nie was regen.
Code: Select all
memset(&rep56, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
rep56.ReportID = 0xFF;
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (PCHAR) &rep56, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(ioHandle, IOW_PIPE_SPECIAL_MODE, (PCHAR) &rep56, IOWKIT56_SPECIAL_REPORT_SIZE);
for (int i=0;i<7;i++)
{
puffer = rep56.Bytes[i];
ListBox->Items->Add(puffer);
}
Passiert denn überhaupt was beim aufrufen der Leseroutine? Bleibt das Programm stehen? schreibt er irgendwas in die Listbox?
Und nebenbei: Wo wird IowKitOpenDevice() aufgerufen?
Ich seh zwar, dass ein IOWKIT_HANDLE vorhanden ist, aber ohne ein OpenDevice wird sich nie was regen.
Software developer
Re: Lesen mit IOW56 unter cBuilder6
IowKitOpenDevice() habe ich global verwendet, das geht auch denn schreiben kann ich ja.
Das Ergebnis der Schleife ist 7 mal "0" , wenn ich aber jetzt
verwende ist das Ergebnis : 248 122 0 43 0 0 0
Dieses Ergebnis ändert sich aber nicht wenn ich verschiedene Ports ändere.
Das Ergebnis der Schleife ist 7 mal "0" , wenn ich aber jetzt
Code: Select all
puffer = rep56io.Bytes[i]
Dieses Ergebnis ändert sich aber nicht wenn ich verschiedene Ports ändere.
- Christoph Jung
- Posts: 673
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Lesen mit IOW56 unter cBuilder6
Wenn ich das richtig sehe, dann wir die Variable ioHandle in der Funktion vor dem Lesen erneut aufgerufen.
Wenn aber ioHandle = IowKitOpenDevice() global aufgerufen wird, kann es sein dass dieser Aufruf ioHandle ungültig, bzw. neu erstellt und der Inhalt (das Handle) verloren geht.
Wie werden denn die IO-Ports gesetzt? Evtl liegt beim Lesen einfach keine Änderung vor und wo nichts ist, da kann auch nichts gelesen werden.
Wenn aber ioHandle = IowKitOpenDevice() global aufgerufen wird, kann es sein dass dieser Aufruf ioHandle ungültig, bzw. neu erstellt und der Inhalt (das Handle) verloren geht.
Wie werden denn die IO-Ports gesetzt? Evtl liegt beim Lesen einfach keine Änderung vor und wo nichts ist, da kann auch nichts gelesen werden.
Software developer
Re: Lesen mit IOW56 unter cBuilder6
So danke nochmal für die Antworten, hier ist jetzt der Code, mit dem das Lesen funktioniert. Der Unterschied ist jetzt, ich mache nach dem Schreiben ein IowKitCloseDevice() und öffne zum Lesen wieder neu. Das globale IowKitOpenDevice() habe ich jetzt entfernt. Warum es nur so funktioniert ist mir nicht klar.
Der Eintrag 'puffer' vom Typ Byte wird im CBuilder in der TListBox direkt als Dezimalzahl angezeigt.
Ich muss jetzt aber erst mal Erfahrung mit dem Warrior sammeln - aber ein wenig verliebt habe ich mich schon :-)
Gruß Manfred
P.S. war sichr nicht meine letzte Frage
Der Eintrag 'puffer' vom Typ Byte wird im CBuilder in der TListBox direkt als Dezimalzahl angezeigt.
Code: Select all
ListBox->Items->Add(puffer);
Code: Select all
void __fastcall TForm1::Button11Click(TObject *Sender)
{
IOWKIT56_SPECIAL_REPORT rep56;
IOWKIT56_IO_REPORT rep56io;
IOWKIT_HANDLE ioHandle;
Byte puffer = 0x00;
ioHandle = IowKitOpenDevice();
memset(&rep56, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
rep56.ReportID = 0xFF;
rep56.Bytes[0] = 0xAA;
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (PCHAR) &rep56, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(ioHandle, IOW_PIPE_SPECIAL_MODE, (PCHAR) &rep56, IOWKIT56_SPECIAL_REPORT_SIZE);
for (int i=0;i<8;i++)
{
if (i<7)
{
puffer = rep56.Bytes[i] ;
ListBox->Items->Add(puffer);
}
else
ListBox->Items->Add("end");
}
IowKitCloseDevice(ioHandle);
}
P.S. war sichr nicht meine letzte Frage
-
- Site Admin
- Posts: 2878
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: Lesen mit IOW56 unter cBuilder6
Na dann ist die Erklärung ganz einfach: Die Antwort vom IO-Warrior ist möglicherweise noch nicht da wenn sie gelesen werden soll.