habe zwecks Einarbeitung mit dem IO-Warrior 24 eine einfache Schaltung mit zwei Tastern aufgebaut, welche mit dem Simple-IO-Delphi DLL Programm auch eingelesen wird. Jedoch bekomme ich es unter C# nicht ausgelesen. IowReadNonBlocking und IowRead geben jeweils "0" zurück, also Fehler, die Byte-Arrays bleiben daher auch unberührt.
Ich habe mein Programm nach dem vordefinierten C#-sample aufgebaut:
Code: Select all
namespace USB.IOWarrior
{
aus der Program.cs des Beispielprojektes kopiert in "iow_namespace.cs", eingebunden, funktioniert
}
Code: Select all
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using USB.IOWarrior;
namespace IOW_Button_Read_Jgn
{
public partial class Form1 : Form
{
private UInt32 num_warriors = 0;
private IntPtr iowHandle;
private UInt32 erg;
private byte[] buffer = new byte[3];
private UInt32 length = 2;
private StringBuilder str = new StringBuilder();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = String.Empty;
label2.Text = String.Empty;
label3.Text = String.Empty;
label4.Text = String.Empty;
label5.Text = String.Empty;
label1.Text = "Opening device... ";
iowHandle = IowKitFunctions.IowKitOpenDevice(); // öffnet tadellos den Warrior
if (iowHandle.ToInt32() != 0)
{
num_warriors = IowKitFunctions.IowKitGetNumDevs(); // gibt für meinen Warrior "1" zurück, weiterhin richtig
label1.Text += "found " + num_warriors.ToString() + " device(s)";
label2.Text = "Using first device with Handle: " + iowHandle.ToString() + " (IO-Warrior " + IowPins(iowHandle).ToString() + ")"; // Handle und Anzahl der Pins wird zurückgegeben
if (IowKitFunctions.IowKitGetRevision(iowHandle) >= IowKitDefines.IOW_NON_LEGACY_REVISION)
{
IowKitFunctions.IowKitGetSerialNumber(iowHandle, str); // Seriennummer wird zurückgegeben
label3.Text = "Revision: " + IowKitFunctions.IowKitGetRevision(iowHandle).ToString() + " Serial Number: " + str.ToString(); // Revision wird zurückgegeben
}
else
{
label3.Text = "Revision: " + IowKitFunctions.IowKitGetRevision(iowHandle).ToString();
}
}
// hier beginnt mein Problem:
erg = IowKitFunctions.IowKitReadNonBlocking(iowHandle, IowKitDefines.IOW_PIPE_IO_PINS, buffer, length);
MessageBox.Show(erg.ToString()); // "0" wird zurückgegeben
label4.Text = buffer[2].ToString(); // "0" wird zurückgegeben
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
for (UInt32 i = 1; i < num_warriors + 1; i++)
{
IowKitFunctions.IowKitCloseDevice(IowKitFunctions.IowKitGetDeviceHandle(i)); // Warrior wird sauber geschlossen, da Programm sich beendet.
}
}
private void timer1_Tick(object sender, EventArgs e)
{
erg = IowKitFunctions.IowKitReadNonBlocking(iowHandle, IowKitDefines.IOW_PIPE_IO_PINS, buffer, 2); // bei Beobachtung beendet sich nichts, auch bei Betätigung des Tasters.
label4.Text = buffer[2].ToString(); // "0"
}
}
}
Edit: Kurioserweise gibt GetLastError().ToString(); ebenso "0" aus, verwende ich die Codebeispiele falsch, oder liegt ein allgemeiner Denkfehler vor?