在.NET中使用USB设备

Dav*_*ult 43 .net usb communication

使用.Net(C#),如何使用USB设备?

如何检测USB事件(连接/断开连接)以及如何与设备通信(读/写).

是否有本地.Net解决方案来执行此操作?

Sof*_*fox 26

我尝试过使用SharpUSBLib,它搞砸了我的电脑(需要系统还原).也发生在同一个项目的同事身上.

我在LibUSBDotNet中找到了另一种选择:http://sourceforge.net/projects/libusbdotnet 但是它还没有使用它,但似乎很好并且最近更新了(与夏普不同).

编辑:截至2017年2月中旬,LibUSBDotNet大约2周前更新.同时,SharpUSBLib自2004年以来一直没有更新.


Jon*_*jap 21

没有本机(例如,系统库)解决方案.这就是moobaa提到的SharpUSBLib存在的原因.

如果您希望为USB设备推送自己的处理程序,可以查看System.IO.PortsSerialPort类.

  • 如何通过SerialPort类使用USB端口? (2认同)

小智 12

我使用以下代码来检测USB设备何时从我的计算机插入和拔出:

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();
        }


    }
Run Code Online (Sandbox Code Playgroud)

您必须确保在关闭应用程序时调用Dispose()方法.否则,在关闭时,您将在运行时收到COM对象错误.


Ale*_*aus 5

我推荐LibUSBDotNet,我已经使用了 2 年的库。如果您必须使用 USB 设备(发送请求、处理响应),这个库是我能找到的最佳解决方案。

优点:

  • 拥有在同步或异步模式下工作所需的所有方法。
  • 提供的源代码
  • 足够的样品可以立即开始使用它。

缺点:

  • 糟糕的文档(这是开源项目的常见问题)。基本上,您可以在 CHM 帮助文件中找到方法的常见描述,仅此而已。但我仍然发现提供的示例和源代码足以编码。只是有时我看到一个奇怪的行为,想知道为什么以这种方式实现它,甚至无法得到任何提示......
  • 好像不再支持了。最新版本于 2010 年 10 月发布。有时很难得到答案。