最近在用C#调试USB程序,libusb源码是C语言的,C#用起来不方便,偶然在网上看到了LibUsbDotNet,这是开源的项目,下载后参考Example,用起来非常方便。

LibUsbDotNet下载 - http://sourceforge.net/projects/libusbdotnet/

我写的示例工程(附件传不上来,只能直接贴代码了^_^) - Enjoy...

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

using LibUsbDotNet;
using LibUsbDotNet.Info;
using LibUsbDotNet.Main;
using LibUsbDotNet.DeviceNotify;

using LibUsbDotNet.LibUsb;

namespace USBLib
{
    public partial class Form1 : Form
    {
        const int myPID = 0x050F;  //产品ID
        const int myVID = 0x0425;  //供应商ID

public static UsbDevice MyUsbDevice;//USB设备
        public static DeviceNotifier DeviceNotifier = new DeviceNotifier();//设备变化通知函数
        public static UsbEndpointWriter writer = null;
        public static UsbEndpointReader reader = null;

delegate void SetTextCallback(string text);//安全线程访问txtReadInt的值

Boolean EnbaleInt = false;//是否使用中断接收

public Form1()
        {
            InitializeComponent();
        }

private void ShowCon(string msg)
        {
            lblConnState.Text = msg;
        }

private void ShowMsg(string msg)
        {
            lblMsg.Text = msg;
        }

private void Form1_Load(object sender, EventArgs e)
        {
            if (FindAndOpenUSB(myVID, myPID) == true)
                ShowCon("设备已连接");
            else
                ShowCon("设备未连接");

DeviceNotifier.OnDeviceNotify += OnDeviceNotifyEvent;

writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep03);
            reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep02);

if( EnbaleInt == true)
            {
                reader.DataReceived += (OnRxEndPointData);
                    reader.DataReceivedEnabled = true;
            }

}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            CloseUSB();
        }
 
        #region USB
        ///
        /// 初始化USB设备
        ///
        /// 设备PID
        /// 设备VID
        ///
        private bool FindAndOpenUSB(int PID, int VID)
        {
            UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(PID, VID);
            UsbRegistry myUsbRegistry   = UsbGlobals.AllDevices.Find(MyUsbFinder);

if (ReferenceEquals(myUsbRegistry, null))
            {
                return false;
            }
            // Open this usb device.
            if (!myUsbRegistry.Open(out MyUsbDevice))
            {
                return false;
            }

MyUsbDevice.SetConfiguration(1);

((LibUsbDevice)MyUsbDevice).ClaimInterface(0);

ShowMsg(string.Format("Find Device:{0}",myUsbRegistry[SPDRP.DeviceDesc]));
            return true;
        }
        //关闭USB设备
        public void CloseUSB()
        {
            if (!ReferenceEquals(reader, null))
                reader.Dispose();
            if (!ReferenceEquals(writer, null))
                writer.Dispose();
            if (!ReferenceEquals(MyUsbDevice,null))
                MyUsbDevice.Close();
        }
        //获得上次错误信息
        public string GetLastError()
        {
            return UsbGlobals.LastErrorString;
        }
        //设备变化消息相应函数
        private void OnDeviceNotifyEvent(object sender, DeviceNotifyEventArgs e)
        {
            if (e.EventType == EventType.DeviceArrival)
            {
                ShowMsg(string.Format("发现有新USB设备连接,PID = 0x{0:X},VID = 0x{1:X}.\r\n设备的详细信息{2}", e.Device.IdProduct, e.Device.IdVendor, e.Device.ToString()));
                //看看目前新连接的USB设备是不是目标设备
                if (e.Device.IdProduct == myPID && e.Device.IdVendor == myVID)
                {
                    ShowMsg("该USB设备是目标设备");
                    //发现目标设备并打开该设备
                    FindAndOpenUSB(myPID,myVID);
                }
                else
                {
                    ShowMsg("该USB设备不是目标设备\r\n");
                }
            }
            else if (e.EventType == EventType.DeviceRemoveComplete)
            {

ShowMsg(string.Format("发现有USB设备移除,PID = 0x{0:X}, VID = 0x{1:X}\r\n设备的详细信息{2}", e.Device.IdProduct, e.Device.IdVendor, e.Device.ToString()));
                //看看目前移除的USB设备是不是目标设备
                if (e.Device.IdProduct == myPID && e.Device.IdVendor == myVID)
                {
                    ShowMsg(string.Format("移除的USB设备是目标设备\r\n"));
                    CloseUSB();
                }
                else
                {
                    ShowMsg(string.Format("移除的USB设备不是目标设备\r\n"));
                }
            }
        }
        //USB中断接收函数
        private void OnRxEndPointData(object sender, EndpointDataEventArgs e)
        {
           //txtReadInt.Text = Encoding.Default.GetString(e.Buffer, 0, e.Count);
            //MessageBox.Show(Encoding.Default.GetString(e.Buffer, 0, e.Count));
            SetText(Encoding.Default.GetString(e.Buffer, 0, e.Count));
        }

#endregion

private void btnSend_Click(object sender, EventArgs e)
        {
            ErrorCode ec = ErrorCode.None;
            
            int bytesWritten;
            try
            {
                ec = writer.Write(Encoding.Default.GetBytes(txtSend.Text), 2000, out bytesWritten);
                if (ec != ErrorCode.None)
                    throw new Exception(UsbGlobals.LastErrorString);
            }
            catch (Exception ex)
            {
                ShowMsg("Error:" + ex.Message);
            }
            finally
            {
               
            }
        }

private void btnRead_Click(object sender, EventArgs e)
        {
            ErrorCode ec = ErrorCode.None;
           
            byte[] readBuffer = new byte[1024];
            int bytesRead;
            try
            {
                ec = reader.Read(readBuffer, 100, out bytesRead);
                if (bytesRead == 0)
                    throw new Exception("No more bytes!");
                txtRead.Text = Encoding.Default.GetString(readBuffer, 0, bytesRead);
            }
            catch (Exception ex)
            {
                ShowMsg("Error:" + ex.Message);
            }
            finally
            {
               
            }
        }
        //线程安全访问txtReadInt
        private void SetText(string text)
        {
            // InvokeRequired required compares the thread ID of the
            // calling thread to the thread ID of the creating thread.
            // If these threads are different, it returns true.
            if (this.txtReadInt.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.txtReadInt.Text = text;
            }
        }

}
}

LibUsbDotNet使用方法的更多相关文章

  1. javaSE27天复习总结

    JAVA学习总结    2 第一天    2 1:计算机概述(了解)    2 (1)计算机    2 (2)计算机硬件    2 (3)计算机软件    2 (4)软件开发(理解)    2 (5) ...

  2. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

  3. 【.net 深呼吸】细说CodeDom(6):方法参数

    本文老周就给大伙伴们介绍一下方法参数代码的生成. 在开始之前,先补充一下上一篇烂文的内容.在上一篇文章中,老周检讨了 MemberAttributes 枚举的用法,老周此前误以为该枚举不能进行按位操作 ...

  4. IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法

    直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...

  5. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  6. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  7. ArcGIS 10.0紧凑型切片读写方法

    首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...

  8. [BOT] 一种android中实现“圆角矩形”的方法

    内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...

  9. JS 判断数据类型的三种方法

    说到数据类型,我们先理一下JavaScript中常见的几种数据类型: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Functi ...

随机推荐

  1. <form:select>

    <form:select path="classification" class="input-medium"> <form:option v ...

  2. orm的设计思路

    一,我们先搞懂什么是orm? ORM:对象关系映射(Object Relational Mapping,简称ORM),目的是想像操作对象一样操作数据库.因为数据库不是面向对象的,所以需要编程进行映射. ...

  3. npm学习(八)之如何使用语义化版本

    npm的语义化版本控制——Semantic versioning 在新发布的代码中传达更改的程度非常重要,因为有时更新会破坏包需要的代码(称为依赖项).语义化版本控制(semver)是一个旨在解决这个 ...

  4. TableView 两种Style Plain and Group 区别以及进阶使用

    一.UITableViewStylePlain 1.有多段时 段头停留(自带效果) 2.没有中间的间距和头部间距(要想有的重写UITableViewCell /UITableViewHeaderFoo ...

  5. cobbler装机系统部署

    1.cobbler安装 [root@linux-node1 ~]# cp /etc/cobbler/settings{,.ori} # 备份 # server,Cobbler服务器的IP. sed - ...

  6. PHP WEB 引擎缓存加速优化

    PHP 缓存加速器介绍 操作码缓存 请求一个 PHP 程序时,PHP 引擎会解析程序,并且将编译码作为特定操作码.这是要执行的代 码的一种二进制表示形式.随后,此操作码有 PHP 引擎执行并丢弃.操作 ...

  7. AIX中的网络管理

    1.AIX中网络配置 AIX支持的适配器: #lsdev  -Cc   adapter   查看网络适配器: #lsdev  -Cc  if   修改网卡属性 #smitty    chgenet   ...

  8. discuz论坛后台部分设置更改之后,清除了缓存网站前台不更新不生效的解决办法

    discuz论坛后台部分设置更改之后,清除了缓存但网站前台不更新不生效的解决办法 在config/config_global.php  把  $_config['memory']['eaccelera ...

  9. zabbix_server: error while loading shared libraries: libperconaserverclient.so.18

    zabbix_server: error while loading shared libraries: libperconaserverclient.so.18 [root@dba_test_002 ...

  10. SP Flash Tool版本对应MTK处理器型号(SP Flash Tool 版本速查)

    SP Flash Tool v3.1224.0.100 MT6516,MT6573,MT6573,MT6575,MT6575,MT6577, SP Flash Tool v3.1332.0.187 M ...