LibUsbDotNet使用方法
最近在用C#调试USB程序,libusb源码是C语言的,C#用起来不方便,偶然在网上看到了LibUsbDotNet,这是开源的项目,下载后参考Example,用起来非常方便。
LibUsbDotNet下载 - http://sourceforge.net/projects/libusbdotnet/
我写的示例工程(附件传不上来,只能直接贴代码了^_^) - Enjoy...
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使用方法的更多相关文章
- javaSE27天复习总结
JAVA学习总结 2 第一天 2 1:计算机概述(了解) 2 (1)计算机 2 (2)计算机硬件 2 (3)计算机软件 2 (4)软件开发(理解) 2 (5) ...
- mapreduce多文件输出的两方法
mapreduce多文件输出的两方法 package duogemap; import java.io.IOException; import org.apache.hadoop.conf ...
- 【.net 深呼吸】细说CodeDom(6):方法参数
本文老周就给大伙伴们介绍一下方法参数代码的生成. 在开始之前,先补充一下上一篇烂文的内容.在上一篇文章中,老周检讨了 MemberAttributes 枚举的用法,老周此前误以为该枚举不能进行按位操作 ...
- IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法
直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- ArcGIS 10.0紧凑型切片读写方法
首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...
- [BOT] 一种android中实现“圆角矩形”的方法
内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...
- JS 判断数据类型的三种方法
说到数据类型,我们先理一下JavaScript中常见的几种数据类型: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Functi ...
随机推荐
- Gym 101466(完整)
题目链接 :点击此处 ## Problem A 题意: 给你n个数,重定义两个数之间的加法不进位,求这些数中两个数相加的最大值和最小值. 题解: 字典树.我们首先将前i-1为放入字典树中,然后在查询第 ...
- 06、CEL文件与灰度图像
R语言里的image方法可以绘制CEL文件的灰度图像.我们先来讨论image这个的函数: 如:x <- c(0:2) y <- c(0:2) m <- matrix(c(1,5,10 ...
- NTFS,FAT32和exFAT文件系统的区别
NTFS,FAT32和exFAT文件系统的区别 本文所有资料来源于网络,仅做个人学习使用,如有侵权,请联系删除 1.什么是文件系统 文件系统是系统对文件的存放排列方式,不同格式的文件系统关系到数据是如 ...
- jQuery全选功能
$(document).ready(function(){ //为父按钮添加事件 $("#chk_all").click(function(){ var a=$("#ch ...
- 阿里服务器+Centos7.4+Tomcat+JDK部署
适用对象 本文档介绍如何使用一台基本配置的云服务器 ECS 实例部署 Java web 项目.适用于刚开始使用阿里云进行建站的个人用户. 配置要求 这里列出的软件版本仅代表写作本文档使用的版本.操作时 ...
- 集群中Session共享解决方案分析
一.为什么要Session共享 Session存储在服务器的内存中,比如Java中,Session存放在JVM的中,Session也可以持久化到file,MySQL,redis等,SessionID存 ...
- mariadb读写分离
mycat maraidb主从架构,是主负责写,从负责读,但前端如果没有调度器的话,是无法实现读写分离的.这就涉及到了中间站,它就是mycat.一定要在主从架构的基础之上实现读写分离. 配置三台的主从 ...
- 脚本_查看当前系统每个IP的连接数
#!bin/bash#作者:liusingbon#功能:查看当前系统每个IP的连接数netstat -n | awk '/^tcp/ {print $5}'| awk -F: '{print $1}' ...
- PAT Basic 1043 输出PATest (20 分)
给定一个长度不超过 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符 ...
- MYSQL explain详解[转载]
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 虽然这篇文章我写的很长,但看起来真的不会困啊,真的都是干货啊!!!! 先解析 ...