Laden...

USB ansteuern

Erstellt von MysticEmpires vor 19 Jahren Letzter Beitrag vor 19 Jahren 8.215 Views
M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 19 Jahren
USB ansteuern

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#?

C
980 Beiträge seit 2003
vor 19 Jahren

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 ...

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 19 Jahren

erlich gesagt habe ich grade nichts verstanden sry

C
980 Beiträge seit 2003
vor 19 Jahren

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 ...

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 19 Jahren

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.

F
529 Beiträge seit 2003
vor 19 Jahren

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

6.862 Beiträge seit 2003
vor 19 Jahren

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.

F
529 Beiträge seit 2003
vor 19 Jahren

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

V
842 Beiträge seit 2003
vor 19 Jahren

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