usb2.dll unter c# einbinden

dengel

Mitglied
hallo alle miteinander,

ich hab folgendes Problem:

ich habe in mein c# Projekt die usb2.dll (Version 1.7 von www.braintechnology.de) eingebunden! Die Funktionen habe ich auch extern deklariert! Nur wenn ich die Funktionen aurufe, ausser Usbinit( die funktioniert), bekomme ich als Rückgabewert false! (also Funktion wurde nicht erfolgreich ausgeführt!!
Ich hab keine Ahnung was ich dabei falsch gemacht gabe!

Vielleicht hat jemand ja das gleiche Problem wie ich und kann mir dabei helfen!
Danke für eure hilfe!

gruß dengel

Code:
dll einbinden:
 
[DllImport("usb2.dll")]
public extern static bool UsbInit(byte DevNum);
[DllImport("usb2.dll")]
unsafe public extern static bool UsbSetLicense( char* Filename);
[DllImport("usb2.dll")]
public extern static bool UsbCheckSpeed(byte DevNum, byte Speed);
[DllImport("usb2.dll")]
public extern static bool UsbGetIOState(byte DevNum, byte LineNum, byte State); 
[DllImport("usb2.dll")]
public extern static bool UsbI2CWriteByte(byte DevNum,byte SlaveAddr,byte Data); 
[DllImport("usb2.dll")]
public extern static bool UsbI2CReadByte(byte DevNum,byte SlaveAddr,byte Data);
[DllImport("usb2.dll")]
public extern static bool UsbI2CWriteBytes(byte DevNum, byte SlaveAddr, short Length, int P);
[DllImport("usb2.dll")]
public extern static bool UsbI2CReadBytes(byte DevNum, byte SlaveAddr, short Length, int P);
[DllImport("usb2.dll")]
public extern static byte UsbGetError();
[DllImport("usb2.dll")]
unsafe public extern static bool UsbGetErrorStringByNr(byte ErrNr, char* PString);
 
funktionsaufruf:
 
public void USBinit()
{
bool result;
string datei = Application.StartupPath + @"\license.dat";
char[] filename = new char[datei.Length];
 
for(int j = 0; j < datei.Length; j++)
{
filename[j] = datei[j];
}
//unsicherer Code (Pointer)
unsafe
{
fixed (char* pfilename = filename)
{ 
//Licensefile einbinden
result = UsbSetLicense(pfilename);
}
}
errornr = UsbGetError();
 
if (UsbInit(DevNum) == true) 
{
byte speed = 0;
if (UsbCheckSpeed(DevNum, speed) == true) 
{
if (speed == 0) 
MessageBox.Show("USB- Interface is connected to a \"full-speed\" Bus",
"message",MessageBoxButtons.OK, MessageBoxIcon.Information);
else 
MessageBox.Show("USB- Interface is connected to a \"high-speed\" Bus",
"message",MessageBoxButtons.OK, MessageBoxIcon.Information);
for (int i=0; i<16; i++) 
UsbGetIOState(DevNum, 0, speed);
} 
else 
{
MessageBox.Show("USB speed could not be determined!", "ERROR",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} 
else 
{
MessageBox.Show("UsbInit failed!", "ERROR",MessageBoxButtons.OK, MessageBoxIcon.Error);
}
errornr = UsbGetError();
}
 
Zuletzt bearbeitet:
Hi Dengel,

willkommen im Forum. :)

Ich würde dich bitten das du deinen Beitrag nochmal editierst, dabei deine Code-Blöcke mit Code Tags umschließt, und eine mehr oder weniger korrekte Groß-/Kleinschreibung wäre auch nicht so schlecht.

Bei der Dll selbst kann ich dir leider nicht helfen, aber du könntest mal Versuchen statt dem unsafe-Code mit den Char-Pointern einfach die String-Klasse zu verwenden. .net sollte das schon korrekt Umwandeln.

MfG,
Alex
 
Hallo Alex!

Danke für deine schnelle Antwort!

Das mit der String- Klasse hab ich schon ausprobiert! Hat aber leider nicht funktioniert!

Hier eine der Funktionsdefinitionen aus der Dll Beschreibung:

function UsbSetLicense(Filename : PChar) : boolean;

Kannst du mir sagen ob meine deklaration richtig ist?

Dank dir!

Gruß dengel

PS: Bin erst von vc++ auf c# umgestiegen und kenn mich noch nicht wirklich damit aus! (wie du warscheinlich schon bemerkt hast*g*)
 
Mh, sehe gerade, dass du das Ergebnis von SetUsbLicense gar nicht überprüfst.
Was kommt den dort zurück? Dieser Wert wird wohl angeben ob die Lizenz gültig ist oder nicht.
 
Guten Morgen miteinander,

also die sache mit der Lizens hab ich jetzt hinbekommen!
Code:
publicexternstaticbool UsbSetLicense(string Filename);

Jetzt hätt ich das nächste Problem! Und zwar würde ich gerne Die Fehlermeldungen abrufen, die die Dll erzeugt!
Zuerst frag ich die Fehlernummer ab!
Code:
 publicexternstaticbyte UsbGetError();

das funktioniert! Dort bekomm ich eine Hexzahl zurück! Dann gibts eine Funktion, die mir mit Hilfe der Hexzahl eine verbale Fehlermeldung zurückliefern sollte! Aber das funktioniert leider net!

Allgemeine Definition:
function UsbGetErrorStringByNr(ErrNr : Byte; var PString : PChar) : boolean;

Meine Definition:
Code:
[DllImport("usb2.dll")]
 
publicexternstaticbool UsbGetErrorStringByNr(byte ErrNr, string PString);

Und meine Funktion:
Code:
 byte errornr = UsbGetError(); //Rückgabewert ist eine Hexzahl -> Fehlernummer
 
bool result = false;
 
string error="";
 
result = UsbGetErrorStringByNr(errornr,error);//Funktion die eine Fehlermeldung
																 //zurückgeben soll
MessageBox.Show(error);

Danke für eure Hilfe!

Gruß dengel

PS: Weiss vielleicht jemand ein gutes Tutorial, das den Umgang mit Dll's in C# beschreibt!
 
Guten Morgen

hab da schon wieder ein problem!(ich hoff ich werd nicht lästig:-( )
Und zwar versuche ich nun mit der Funktion
(allgemeine Funktionsbeschreibung)

function UsbI2CWriteBytes(DevNum, SlaveAddr, Length : Word; P : Pointer) : boolean;

Telegramme über I²C zu verschicken.

DllImport:

Code:
 [DllImport("usb2.dll")]
 
public extern static bool UsbI2CWriteBytes(byte DevNum, byte SlaveAddr, short Length, string P);

Funktionsaufruf:
Code:
bool result = UsbI2CWriteBytes(DevNum, adr, datalength, data[0]);

zu meinem Probelm:

in der Dll ist die Funktion mit einem Pointer als Übergabewert deklariert. Unter C# gibts die ja nicht! ich hab versucht den Pointer mit unsafe code auszuführen! jedoch ohne erfolg! Bei google hab ich ne seite gefunden, auf der beschrieben wird, das man mit einem Marshal befehl diesen pointer in C# verwenden kann! Nur begreif ich das nicht wie das funktionieren soll! Dem Pointer soll ein Array übergeben werden, in dem die Datenbytes enthalten sind, die ich verschicken will.

Vielleicht kann mir da irgendjemand helfen mir den Pointern und dem marshall Befehl! Oder es weiss jemand ein Tutorial, das den marshal Befehl und den Umgang mit Pointern erklärt!
Bin für jede Hilfe dankbar!

Wünsch euch ein schönes Wochenende

gruß dengel
 
Hat sich erledigt! Hab's hinbekommen!

Es lag nicht an der Deklaration oder am Funktionsaufruf, sondern ich hatte die falsche I²C Geschwindigkeit eingestellt! Deshalb wurde nichts gesendet!

Gruß dengel
 
Zuletzt bearbeitet:
Zurück