Guten Tag,
hat schon mal jemand mit USB gearbeitet? Also ich möchte ein verbindung zu einen USB Gerät herstellen. Unter WinAPI war dies ja mit DeviceIoControl möglich aber wie lauft das unter C#?
Wohl gleich, auch mit der WinAPI (das .NET Framework bietet mit gutem Grund nichts in diesem Bereich, wenn sich einmal erhaltene Handles auch bestens z.b. auf Streams mappen lassen) und entweder unsafe code oder haufenweise Marshalling ...
Du kannst auch von C# aus Syscalls aufrufen. Dabei müssen aber jegliche Daten (Parameter, Return value) "gemarshallt" werden, das macht das Framework aber automatisch, wenn du mit Attributen sagst wie es das anstellen soll. Bsp:
[DllImport("kernel32",EntryPoint="CloseHandle",SetLastError=true,CharSet=CharSet.Unicode)]
[return : MarshalAs( UnmanagedType.VariantBool )]
internal static extern bool CloseHandle(uint hHandle);
... falls du Memory Mapping brauchst geht das manuell z.b. mit der Marshal Klasse machen, oder du benutzt gleich unsafe code ...
Also ich habe jetzt mal folgende Funktionenh der dll entnommen:
//CreatFile
[DllImport("kernel32.dll")]
public static extern IntPtr CreateFile(
string lpFileName, int dwDesiredAccess, int dwShareMode,
IntPtr lpSecurityAttributes, int dwCreationDisposition,
int dwFlagsAndAttributes, IntPtr hTemplateFile );
private const int FILE_SHARE_READ = 1;
private const int OPEN_ALWAYS = 4;
private const int INVALID_HANDLE_VALUE = -1;
//DeviceIoControl
[DllImport("kernel32.dll", ExactSpelling=true) ]
internal static extern bool DeviceIoControl(
IntPtr hDevice, int dwIoControlCode, IntPtr lpInBuffer, int nInBufferSize,
IntPtr lpOutBuffer, int nOutBufferSize, ref int lpBytesReturned, IntPtr lpOverlapped );
//WriteFile
[DllImport("kernel32", PreserveSig = false)]
static extern bool WriteFile(
int handle,
string sourceBuffer,
int nBytesToWrite,
int nBytesWritten,
int overlapped);
//CloseHandle
[DllImport("kernel32",EntryPoint="CloseHandle",SetLastError=true,CharSet=CharSet.Unicode)]
[return : MarshalAs( UnmanagedType.VariantBool )]
internal static extern bool CloseHandle(uint hHandle)[/CODE]
und habe es folgendermassen versucht anzusteuern:
[CODE]//Aufbau der Verbindung
IntPtr vDriver = CreateFile( "\\\\.\\USB#Vid_22b8&Pid_4902#5&3342be81&0&1#{a5dcbf10-6530-11d2-901f-00c04fb951ed}", 0, FILE_SHARE_READ, IntPtr.Zero, OPEN_ALWAYS, 0, IntPtr.Zero );
if ((int)vDriver == INVALID_HANDLE_VALUE)
{
MessageBox.Show("Verbindung zum USB-Port konnte nicht hergestellt werden!");
CloseHandle((uint)vDriver);
}
//Test Comando senden
So also die Verbindung steht bzw. er giebt keine Meldung aus. Nur weis ich jetzt leider nicht mehr wieter wie das mit DeviceIoControl und writefile liefe.
Ich zweifle dass das geht, denn unter Windows dürfen nur Treiber Hardware ansteuern abgesehen von der seriellen Schnittstelle. Man kann ohne Trick17.dll nicht mal den paralellen Bus verwenden. Daher wird das so wohl nix.....
Kein Gewär, kann auch falsch sein, ist wie gesagt nur eine Vermutung!!!
Edit:
Huch, wer lesen und schreiben kann ist klar im Vorteil! Kannst du mal ein bisschen Code zeigen wie das mittels WinApi möglich ist, vielleicht kann ich dir dann weiterhelfen!
--
mfg
Franknstein
Besuchen sie das VisualC++ - Forum
In diesem Thread findest du eine Link wo eine Komponente erstellt wird um auf den USB Port zugreifen zu können.
mfg Talla
Baka wa shinanakya naoranai.
Mein XING Profil.
Das tut seinen Dienst aber nur mit spezieller Hardware, oder besser dank spezieller Treiber für diese spezielle Hardware -> wie ich das verstanden habe klappt das nur mit der "Cypress EZ-USB FX development board".
--
mfg
Franknstein
Besuchen sie das VisualC++ - Forum
Hi!
@talla:
Was soll sowas? Wieso leitest du in einen Thread wegen einem Link um? Würde dabei auch noch mehr als nur ein Satz stehen, nämlich ein ganzer Text, würde ich es verstehen, aber nicht für einen Link in einem Thread, diesen kannst du dann auch hier posten!
Code-Hacker