2008-09-16 12 views
40

Mit. NET (C#), wie können Sie mit USB-Geräten arbeiten?Arbeiten mit USB-Geräten in .NET

Wie können Sie USB-Ereignisse (Verbindungen/Trennungen) erkennen und wie kommunizieren Sie mit Geräten (Lesen/Schreiben).

Gibt es dafür eine native .Net-Lösung?

+0

Weitere Antworten hier: http://stackoverflow.com/questions/2803890/net-api-for-hid-usb –

Antwort

19

Es gibt keine native (z. B. Systembibliotheken) Lösung dafür. Das ist der Grund, warum existiert wie von moobaa erwähnt.

Wenn Sie Ihre eigene Handler für USB-Geräte rollen möchten, können Sie die SerialPort class of System.IO.Ports überprüfen.

+1

Wie kann man den USB-Port über die SerialPort-Klasse verwenden? – AgentFire

+0

Nun, in '08 lief USB 1.0 von der seriellen Port-Technologie ab. : D Nicht sicher, wie dies mit USB 2.0 und USB 3.0 zu tun –

+0

Ich benutze einfach CreateFile winapi, um auf USB zuzugreifen :) – AgentFire

0

Die meisten USB-Chipsätze kommen mit Treibern. Silicon Labs hat eins.

+0

So habe ich eine Abhängigkeit vom Treiber selbst? Gibt es eine generische Lösung, die auf allen Maschinen funktioniert? –

+0

Sie werden sowohl von der DLL als auch von einer Hardwareabhängigkeit vom verwendeten Chipsatz abhängig sein. Dies ist jedoch der schnellste Weg, um mit der USB-Kommunikation zu beginnen, wenn Sie die Kontrolle über die Software und die Hardware haben. – Nick

1

Es ist ein generisches Toolkit WinDriver für USB-Treiber im User-Modus zu schreiben, die # .NET als auch

22

stützt ich habe mit SharpUSBLib versucht und es vermasselte meinen Computer (eine Systemwiederherstellung erforderlich). Passiert auch ein Kollege am selben Projekt.

Ich habe eine Alternative in LibUSBDotNet gefunden: http://sourceforge.net/projects/libusbdotnet Havn verwendet es noch nicht viel, aber scheint gut und vor kurzem aktualisiert (im Gegensatz zu Sharp).

EDIT: Ab Mitte Februar 2017 wurde LibUSBDotNet vor etwa 2 Wochen aktualisiert. Inzwischen hat SharpUSBLib nicht aktualisiert wurde seit 2004

+0

Awesome, danke! –

+0

nette eins. Danke – Esen

0

Ich habe eine Schnittstelle zu einem Teensy bekommen recht gut funktioniert mit this article

4

Ich würde LibUSBDotNet empfehlen, die Bibliothek, die ich seit 2 Jahren verwende. Wenn Sie mit einem USB-Gerät arbeiten müssen (Anfragen senden, Antworten bearbeiten), war diese Bibliothek die beste Lösung, die ich finden konnte.

Pro:

  • hat alle Methoden, die Sie müssen synchron oder asynchron-Modus arbeiten.
  • Quellcode zur Verfügung gestellt
  • Genug Proben, um es sofort zu verwenden.

Nachteile:

  • Schlechte Dokumentation (es ist häufiges Problem für Open-Source-Projekte). Im Grunde finden Sie nur eine allgemeine Beschreibung der Methoden in der CHM-Hilfedatei und das war's. Aber ich finde immer noch zur Verfügung gestellte Beispiele und Quellcode ist genug für die Codierung. Nur manchmal sehe ich ein seltsames Verhalten und möchte wissen, warum es auf diese Weise implementiert wurde und nicht einmal einen Hinweis bekommen kann ...
  • Scheint nicht mehr unterstützt. Letzte Version wurde im Oktober 2010 veröffentlicht. Und es ist manchmal schwer Antworten zu bekommen.
10

habe ich den folgenden Code, wenn die Geräte USB zu erkennen, wurden ein- und ausgesteckt von meinem Computer:

class USBControl : IDisposable 
    { 
     // used for monitoring plugging and unplugging of USB devices. 
     private ManagementEventWatcher watcherAttach; 
     private ManagementEventWatcher watcherRemove; 

     public USBControl() 
     { 
      // Add USB plugged event watching 
      watcherAttach = new ManagementEventWatcher(); 
      //var queryAttach = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"); 
      watcherAttach.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); 
      watcherAttach.Query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"); 
      watcherAttach.Start(); 

      // Add USB unplugged event watching 
      watcherRemove = new ManagementEventWatcher(); 
      //var queryRemove = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 3"); 
      watcherRemove.EventArrived += new EventArrivedEventHandler(watcher_EventRemoved); 
      watcherRemove.Query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 3"); 
      watcherRemove.Start(); 
     } 

     /// <summary> 
     /// Used to dispose of the USB device watchers when the USBControl class is disposed of. 
     /// </summary> 
     public void Dispose() 
     { 
      watcherAttach.Stop(); 
      watcherRemove.Stop(); 
      //Thread.Sleep(1000); 
      watcherAttach.Dispose(); 
      watcherRemove.Dispose(); 
      //Thread.Sleep(1000); 
     } 

     void watcher_EventArrived(object sender, EventArrivedEventArgs e) 
     { 
      Debug.WriteLine("watcher_EventArrived"); 
     } 

     void watcher_EventRemoved(object sender, EventArrivedEventArgs e) 
     { 
      Debug.WriteLine("watcher_EventRemoved"); 
     } 

     ~USBControl() 
     { 
      this.Dispose(); 
     } 


    } 

Sie müssen Sie sicherstellen, dass die Dispose() -Methode aufrufen, wenn die Anwendung geschlossen wird. Andernfalls erhalten Sie beim Schließen einen COM-Objektfehler zur Laufzeit.

1

Wenn Sie National Instruments Software auf Ihrem PC haben, können Sie einen USB-Treiber mit ihren "NI-VISA-Treiber-Assistent" erstellen.

Schritte des USB-Treibers zu erstellen: http://www.ni.com/tutorial/4478/en/

Sobald Sie den Treiber erstellt werden Sie in der Lage sein, die Bytes zu schreiben und lesen zu jedem USB-Gerät.

Sicherstellen, dass der Fahrer durch Fenster im Geräte-Manager gesehen:

enter image description here

C# Code:

using NationalInstruments.VisaNS; 

    #region UsbRaw 
    /// <summary> 
    /// Class to communicate with USB Devices using the UsbRaw Class of National Instruments 
    /// </summary> 
    public class UsbRaw 
    { 
     private NationalInstruments.VisaNS.UsbRaw usbRaw; 
     private List<byte> DataReceived = new List<byte>(); 

     /// <summary> 
     /// Initialize the USB Device to interact with 
     /// </summary> 
     /// <param name="ResourseName">In this format: "USB0::0x1448::0x8CA0::NI-VISA-30004::RAW". Use the NI-VISA Driver Wizard from Start»All Programs»National Instruments»VISA»Driver Wizard to create the USB Driver for the device you need to talk to.</param> 
     public UsbRaw(string ResourseName) 
     { 
      usbRaw = new NationalInstruments.VisaNS.UsbRaw(ResourseName, AccessModes.NoLock, 10000, false); 
      usbRaw.UsbInterrupt += new UsbRawInterruptEventHandler(OnUSBInterrupt); 
      usbRaw.EnableEvent(UsbRawEventType.UsbInterrupt, EventMechanism.Handler); 
     } 

     /// <summary> 
     /// Clears a USB Device from any previous commands 
     /// </summary> 
     public void Clear() 
     { 
      usbRaw.Clear(); 
     } 

     /// <summary> 
     /// Writes Bytes to the USB Device 
     /// </summary> 
     /// <param name="EndPoint">USB Bulk Out Pipe attribute to send the data to. For example: If you see on the Bus Hound sniffer tool that data is coming out from something like 28.4 (Device column), this means that the USB is using Endpoint 4 (Number after the dot)</param> 
     /// <param name="BytesToSend">Data to send to the USB device</param> 
     public void Write(short EndPoint, byte[] BytesToSend) 
     { 
      usbRaw.BulkOutPipe = EndPoint; 
      usbRaw.Write(BytesToSend);  // Write to USB 
     } 

     /// <summary> 
     /// Reads bytes from a USB Device 
     /// </summary> 
     /// <returns>Bytes Read</returns> 
     public byte[] Read() 
     { 
      usbRaw.ReadByteArray();  // This fires the UsbRawInterruptEventHandler     

      byte[] rxBytes = DataReceived.ToArray();  // Collects the data received 

      return rxBytes; 
     } 

     /// <summary> 
     /// This is used to get the data received by the USB device 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     private void OnUSBInterrupt(object sender, UsbRawInterruptEventArgs e) 
     { 
      try 
      { 
       DataReceived.Clear();  // Clear previous data received 
       DataReceived.AddRange(e.DataBuffer);      
      } 
      catch (Exception exp) 
      { 
       string errorMsg = "Error: " + exp.Message; 
       DataReceived.AddRange(ASCIIEncoding.ASCII.GetBytes(errorMsg)); 
      } 
     } 

     /// <summary> 
     /// Use this function to clean up the UsbRaw class 
     /// </summary> 
     public void Dispose() 
     { 
      usbRaw.DisableEvent(UsbRawEventType.UsbInterrupt, EventMechanism.Handler); 

      if (usbRaw != null) 
      { 
       usbRaw.Dispose(); 
      }    
     } 

    } 
    #endregion UsbRaw 

Verbrauch:

UsbRaw usbRaw = new UsbRaw("USB0::0x1448::0x8CA0::NI-VISA-30004::RAW"); 

byte[] sendData = new byte[] { 0x53, 0x4c, 0x56 }; 
usbRaw.Write(4, sendData);  // Write bytes to the USB Device 
byte[] readData = usbRaw.Read(); // Read bytes from the USB Device 

usbRaw.Dispose(); 

Hope this jemand hilft.