Lesen mit IOW56 unter cBuilder6

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
n_Bahner
Posts: 7
Joined: Sun Jul 12, 2009 12:23 pm

Lesen mit IOW56 unter cBuilder6

Post by n_Bahner »

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
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: Lesen mit IOW56 unter cBuilder6

Post by friend-of-rq »

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
n_Bahner
Posts: 7
Joined: Sun Jul 12, 2009 12:23 pm

Re: Lesen mit IOW56 unter cBuilder6

Post by n_Bahner »

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:

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);
Zum lesen hatte ich den Weg mit IowKitRead gesucht, aber erfolglos.

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;
     

vielleicht hat hier jemand Plan oder eine Hilfestellung, die Anfänger wie ich versteht :-)
Danke
User avatar
Christoph Jung
Posts: 673
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Lesen mit IOW56 unter cBuilder6

Post by Christoph Jung »

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:

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
Guido Körber
Site Admin
Posts: 2878
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Lesen mit IOW56 unter cBuilder6

Post by Guido Körber »

Im zweiten Beispiel wird geschrieben und nicht gelesen?!?
n_Bahner
Posts: 7
Joined: Sun Jul 12, 2009 12:23 pm

Re: Lesen mit IOW56 unter cBuilder6

Post by n_Bahner »

Ja, das 2. Beispiel war natürlich Unfug, da wollte ich was anderes reinkopieren.
Im Wesentlichen hatte ich es auch so, aber

Code: Select all

Edit4->Text = rep56io.Bytes[0];
bringt als Ergebnis halt immer 0. Ich denke "stückeln" könnte ich mir das schon aber dazu brauche ich halt Daten.
Guido Körber
Site Admin
Posts: 2878
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Lesen mit IOW56 unter cBuilder6

Post by Guido Körber »

Da nicht klar ist wie die Daten gelesen werden kann man dazu keine Antwort liefern.
User avatar
Christoph Jung
Posts: 673
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Lesen mit IOW56 unter cBuilder6

Post by Christoph Jung »

Bitte mal die ganz Lese-Routine posten.
Software developer
n_Bahner
Posts: 7
Joined: Sun Jul 12, 2009 12:23 pm

Re: Lesen mit IOW56 unter cBuilder6

Post by n_Bahner »

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");


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

Re: Lesen mit IOW56 unter cBuilder6

Post by Christoph Jung »

Die Schleife in der Leseroutine ist falsch. Es genügt, wenn einmal der Write-/ und Read-Befehl gestartet wird.

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);
      }
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.
Software developer
n_Bahner
Posts: 7
Joined: Sun Jul 12, 2009 12:23 pm

Re: Lesen mit IOW56 unter cBuilder6

Post by n_Bahner »

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

Code: Select all

puffer = rep56io.Bytes[i]
verwende ist das Ergebnis : 248 122 0 43 0 0 0
Dieses Ergebnis ändert sich aber nicht wenn ich verschiedene Ports ändere.
User avatar
Christoph Jung
Posts: 673
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Lesen mit IOW56 unter cBuilder6

Post by Christoph Jung »

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.
Software developer
n_Bahner
Posts: 7
Joined: Sun Jul 12, 2009 12:23 pm

Re: Lesen mit IOW56 unter cBuilder6

Post by n_Bahner »

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.

Code: Select all

ListBox->Items->Add(puffer);
Ich muss jetzt aber erst mal Erfahrung mit dem Warrior sammeln - aber ein wenig verliebt habe ich mich schon :-)

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);
}
Gruß Manfred

P.S. war sichr nicht meine letzte Frage
Guido Körber
Site Admin
Posts: 2878
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Lesen mit IOW56 unter cBuilder6

Post by Guido Körber »

Na dann ist die Erklärung ganz einfach: Die Antwort vom IO-Warrior ist möglicherweise noch nicht da wenn sie gelesen werden soll.
Post Reply