Probleme mit IowKitReadImmediate

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
joerg
Posts: 8
Joined: Sat Dec 02, 2006 12:15 pm

Probleme mit IowKitReadImmediate

Post by joerg »

Hallo!
Ich beschäftige mich erst seit kurzem mit dem IOW! Hab folgende Frage:
Ich führe mit einem Microcontroller eine AD-Wandlung durch und gebe diese auf einen Port des IOW weiter. Über diesen möchte ich die Daten dann über USB an meinen PC senden.
Ich habe gesehen, dass es grundsätzlich die Möglichkeiten von IowKitRead und IowKitReadImmediate gibt.
Ich möchte diese Werte nicht nur bei Änderung übertragen, deswegen liebäugele ich etwas mehr mit der Immediate-Version. Allerdings gibt es folgende Probleme:

Ich schreibe meine Software in C#!
D.h. es gibt keinen Datentyp DWORD. Ich habe also einen int genommen, was gehen sollte.

Meine dll binde ich wie folgt ein:

Code: Select all

[DllImport("iowkit.dll")]
        public static extern bool IowKitReadImmediate(int Handle, int dWordBuffer);
Mein Aufruf im Programm:

Code: Select all

bool gelesen;
int IowHandle;
int dEin;

//...
gelesen = IowKitReadImmediate(IowHandle, dEin);
//...
Durch den Compiler geht es auch ohne Probleme, allerdings setzt er während der Laufzeit mit folgendem Problem aus:

"AccessViolationException wurde nicht behandelt
Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."


Ich habs auch schon mit

Code: Select all

gelesen = IowKitReadImmediate(IowHandle, &dEin);
probiert, aber da gehts nicht mal durch den Compiler durch...

Kann mir jemand helfen?!
Danke!
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Hallo joerg,

mein erster Tipp wäre den Parameter dWordBuffer per ref zu übergeben. Die iowkit-lib muss diesen Wert ändern (bzw den Wert an der Speicherstelle die hier übergeben wird.)
Versuch mal

Code: Select all

[DllImport("iowkit.dll")] 
        public static extern bool IowKitReadImmediate(int Handle, ref int dWordBuffer);

bool gelesen; 
int IowHandle; 
int dEin; 

//... 
gelesen = IowKitReadImmediate(IowHandle, ref dEin); 
//... 
Eberhard
joerg
Posts: 8
Joined: Sat Dec 02, 2006 12:15 pm

Post by joerg »

Hallo!
Danke für die schnelle Antwort!
Jetzt übersetzt er wieder fehlerfrei, auch das Programm läuft ohne Fehlermeldung... allerdings "hängt" er, d.h. nur die Sanduhr ist zu sehen!
Weitere Vorschläge!?

der Vollständigkeit halber mal mein Code:

Code: Select all

[DllImport("iowkit.dll")]
        public static extern int IowKitOpenDevice();
        [DllImport("iowkit.dll")]
        public static extern int IowKitRead(int Handle, int PipeNumber, byte[] Buffer, int Length);
        [DllImport("iowkit.dll")]
        public static extern void IowKitCloseDevice(int Handle);
        [DllImport("iowkit.dll")]
        public static extern bool IowKitReadImmediate(int Handle, ref int dWordBuffer);
        [DllImport("iowkit.dll")]
        public static extern int IowKitWrite(int Handle, int PipeNumber, byte[] Buffer, int Length);

        int IowHandle;
        byte[] My_Buffer = new byte[5];
        string My_Text;
        int dEin;
        Thread thrLesen;
        bool gelesen;

        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            IowHandle = IowKitOpenDevice();
            My_Buffer[0] = 0x00;
            My_Buffer[1] = 0x00;
            My_Buffer[2] = 0x00;
            My_Buffer[3] = 0x00;
            My_Buffer[4] = 0x00;
            IowKitWrite(IowHandle, 0, My_Buffer, 5);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            gelesen = IowKitReadImmediate(IowHandle, ref dEin);
            label1.Text = My_Buffer[3].ToString();
            switch (My_Buffer[3])
            {
                case 0x00:
                    //...Verarbeitung...
                    break;
            }
         }
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Hallo joerg,
der Code verrät mir dazu nichts.
(Ein Thread ist deklariert, tut der was? Sehr beliebt sind Threads auf die mit join() gewartet wird, die sich aber nicht beenden.)

Was bedeutet bei dir Programm läuft ohne Fehlermeldung und hängt ?

Console.WriteLine is your friend!

Eberhard
joerg
Posts: 8
Joined: Sat Dec 02, 2006 12:15 pm

Post by joerg »

Hallo!
Der Thread ist noch ein Überbleibsel, den ich bei IowKitRead probiert hatte, ist also nicht mehr verwendet!

Hab jetzt ein paar Console.Writeline eingefügt:

Code: Select all

            Console.WriteLine("Tick");
            gelesen = IowKitReadImmediate(IowHandle, ref dEin);
            Console.WriteLine("gelesen");
            label1.Text = My_Buffer[3].ToString();
Anfangs kommen ein paar "Tick", "gelesen"-Ausgaben, aber dann bleibt er einfach nach "Tick" stehen!
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Sorry, fällt mir jetzt auch nichts zu ein :-(

Ich würde erst mal die ReadImmediate-Zeile auskommentieren um zu sehen ob deine Ticks dann alle kommen.
Und dann auch mal label.Text=......

Eberhard
joerg
Posts: 8
Joined: Sat Dec 02, 2006 12:15 pm

Post by joerg »

ja, dann kommt alles sauber!

hoffe ich also mal, dass jemand anders weiterhelfen kann!
Danke trotzdem!
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Hallo joerg,

wie schnell kommen denn eigentlich die ticks vom Timer ?

In der Library wird intern immer das SpecialMode Kommando GetCurrentPinStatus (ReportID=0xFF) an den IOWarrior geschickt. Es dauert also mal mindestens 12-20 Millisekunden bis das Ergebniss des Aufrufs ermittelt ist.

Ich würde mir auf jeden Fall mal die Funktion IowKit_ReadNonBlocking anschauen. Die erzeugt keinen Traffic auf dem USB-Bus.

BTW: Der Schreibbefehl

Code: Select all

private void Form1_Load(object sender, EventArgs e) 
        { 
            IowHandle = IowKitOpenDevice(); 
            My_Buffer[0] = 0x00; 
            My_Buffer[1] = 0x00; 
            My_Buffer[2] = 0x00; 
            My_Buffer[3] = 0x00; 
            My_Buffer[4] = 0x00; 
            IowKitWrite(IowHandle, 0, My_Buffer, 5); 
        } 
setzt alle Pins des Iow auf 0, es wird sich also niemals etwas am Status der Pins ändern. (Ein Pin der als Eingang dienen soll muss auf 1 gesetzt sein, siehe Erklärung im Datenblatt.)

P.S.
Macht dein Programm sonst noch irgendetwas, was man im bisherigen Code nicht sehen konnte?

Eberhard
joerg
Posts: 8
Joined: Sat Dec 02, 2006 12:15 pm

Post by joerg »

Hallo!
Hab meine Ticks jetzt auf 1000ms hochgesetzt! Kein Erfolg!
Ich würde mir auf jeden Fall mal die Funktion IowKit_ReadNonBlocking anschauen. Die erzeugt keinen Traffic auf dem USB-Bus.
Dazu hab ich nirgends was gefunden!

Die Pin-Zuweisungen hab ich jetzt auskommentiert!

Ja, ansonsten macht das Programm auch noch nix weiter! Es geht mir ja erst einmal darum, das "ständige" Lesen der Eingänge zu realisieren und verstehen!

Weitere Hilfe ist also sehr willkommen!
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

wayoda wrote:
Ich würde mir auf jeden Fall mal die Funktion IowKit_ReadNonBlocking anschauen. Die erzeugt keinen Traffic auf dem USB-Bus.
Dazu hab ich nirgends was gefunden!
Die Funktion war neu in der aktuellen Version 1.5 der IowKit_Lib (Download bei CodeMercs, Beschreibung in dem PDF zur Lib). Sie hat die gleichen Parameter wie IowKit_Read, blockiert aber niemals.
Wenn neue Daten vorliegen gibt sie true zurück, und man hat die Daten im Puffer. Bei False ist seit dem letezen Aufruf nichts passiert. Das wäre also sehr geeignet für einen Aufruf per Timer.

Eberhard
joerg
Posts: 8
Joined: Sat Dec 02, 2006 12:15 pm

Post by joerg »

Bingo!
Das wars!
Jetzt klappts einwandfrei!!!!
Herzlichen Dank! Jetzt geht die eigentliche Arbeit los ;-)

Schönen Sonntag noch!
Jörg
Post Reply