原文:dot net core 使用 usb

本文告诉大家如何在 dot net core 使用 usb

首先需要打开 Nuget 安装 CoreCompat.LibUsbDotNet ,这是一个usb连接的库。

获得通知

如果需要获得 USB 通知,那么可以通过下面的代码

        static void Main(string[] args)
{
Console.WriteLine("Hello World!");
LibUsbDotNet.DeviceNotify.IDeviceNotifier kdkpgTxivryglh = new LinuxDeviceNotifier
{
Enabled = true
};
kdkpgTxivryglh.OnDeviceNotify += OnDeviceNotify;
} private static void OnDeviceNotify(object sender, DeviceNotifyEventArgs e)
{
Console.WriteLine($"插入设备的 Pid {e.Device.IdProduct} vid {e.Device.IdVendor}");
}

从上面的代码也可以看到只有在 Linux 下才会触发

我尝试插入一个 hid 设备,结果没有通知,估计只有在 Linux 才可以。

需要注意,通过上面的这个方法只能获得hid设备的通知

读写

在开始读写的时候就需要先知道 usb 的 pid 和 vid ,其中 vid 是 Vendor ID,供应商识别码。几乎一个公司有一个识别码。VID由供应商向USB-IF(Implementers Forum,应用者论坛)申请,除了一些诡异的 usb 会重复之外,可以认为不同公司的 vid 是不同。而一个公司有很多产品,他可以给一个产品一个pid,所以pid是 Product ID,产品识别码。

获取 usb 的方法

var usbDeviceFinder = new UsbDeviceFinder(vid: 0xFF21, pid: 0x1F02);

请把 pid 和 vid 修改为你需要的。

如果不知道 pid vid 需要拿到所有插入的 usb 请使用下面代码


foreach (UsbRegistry temp in UsbDevice.AllWinUsbDevices)
{ }

如果知道了 pid 和 vid 拿到 usb 就可以使用下面代码

            var usb = UsbDevice.OpenUsbDevice(usbDeviceFinder);

在读的时候,因为不想去判断当前是 win 还是 linux 所以先转换接口,这样就不需要管在什么系统,都一样

下面代码就是打开第一个端口进行读写,如果你测试的 usb 的第一个端口是可以读写,就可以使用下面方法

            // Select config #1
wholeUsbDevice.SetConfiguration(1); // Claim interface #0.
wholeUsbDevice.ClaimInterface(0); // open read endpoint 1.
UsbEndpointReader reader = usb.OpenEndpointReader(ReadEndpointID.Ep01); // open write endpoint 1.
UsbEndpointWriter writer = usb.OpenEndpointWriter(WriteEndpointID.Ep01);

先来写入字符串

            var str = "lindexi";
var sejDqhaquwy = Encoding.UTF8.GetBytes(str); var ec = writer.Write(sejDqhaquwy, 2000, out var transferLength);

从代码可以看到 Write 有很多个重载,上面使用的重载是 数据,超时时间,写入的长度。返回的是错误代码,使用下面代码可以判断是否写入成功

          if (writer.Write(sejDqhaquwy, 2000, out var transferLength) == ErrorCode.Success)
{
Console.WriteLine("写入成功");
}

读取数据可以使用下面代码

            if (reader.Read(sejDqhaquwy, 2000, out transferLength) == ErrorCode.Success)
{
}

读取也有很多个重载,这里使用的是 读取数据存放的数组,超时时间,读取到的长度。

如果需要异步读写,代码有些多

         var offset = 0;
var length = sejDqhaquwy.Length;
var timeout = 2000;
writer.SubmitAsyncTransfer(sejDqhaquwy, offset, length, timeout, out var transferContext);
transferContext.Wait(out var transferredCount);//等待

等待的方式不是使用 await 而是通过 AsyncWaitHandle 等待。

串口通信

如果需要在 dotnet core 引用 System.IO.Ports 可以在程序包管理器输入下面代码

Install-Package System.IO.Ports -Source [https://dotnet.myget.org/F/dotnet-core/api/v3/index.json](https://dotnet.myget.org/F/dotnet-core/api/v3/index.json )

或者设置 Nuget 的源添加 https://dotnet.myget.org/F/dotnet-core/api/v3/index.json 然后寻找 System.IO.Ports 安装

请看 https://dotnet.myget.org/feed/dotnet-core/package/nuget/System.IO.Ports

或者输入下面代码

Install-Package System.IO.Ports

LGPL

需要知道这个库的协议是 LGPL 也就是使用了这个库就需要开放源代码

更多参考请看 LibUsbDotNet LibUsbDotNet/LibUsbDotNet


本文会经常更新,请阅读原文:
https://lindexi.gitee.io/lindexi/post/dot-net-core-%E4%BD%BF%E7%94%A8-usb.html
,以避免陈旧错误知识的误导,同时有更好的阅读体验。


本作品采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:
https://lindexi.gitee.io
),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请
与我联系

最新文章

  1. windows 环境和linux环境下 ping命令的区别:
  2. eclipse启动不了
  3. Memcache限制端口和访问IP
  4. 【转】SQLite提示database disk image is malformed的解决方法
  5. SQL 必知必会-- 第1课:数据库基础和什么是SQL
  6. SqlServer ,storedprocedure操作
  7. 斜堆,非旋转treap,替罪羊树
  8. [php] php操作xml
  9. 手把手教你用webpack3搭建react项目(开发环境和生产环境)(一)
  10. BZOJ_2595_[Wc2008]游览计划_斯坦纳树
  11. 深入解析ConcurrentHashMap类
  12. 面向面试编程代码片段之GC
  13. 【学亮IT手记】Servlet的生命周期
  14. lanmp安装
  15. MySQL 基础六 临时表 复制表结构
  16. Linux下的两种磁盘分区工具的使用
  17. sql(Oracle)优化之索引
  18. Applese的毒气炸弹-最小生成树Kruskal算法
  19. 【推荐】介绍两款Windows资源管理器,Q-Dir 与 FreeCommander XE(比TotalCommander更易用的免费资源管理器)
  20. Spark2 AccumulatorV2累加器

热门文章

  1. 1.Python字符编码
  2. SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能
  3. (素材源代码) 猫猫学IOS(五)UI之360等下载管理器九宫格UI
  4. Snail—Hibernate之自写固定组件
  5. or小计
  6. [PReact] Create a Hello World App with Preact
  7. HASH算法具体解释
  8. [Webpack] Configure Prepack with Webpack
  9. [ES7] Handle Errors in Asynchronous Functions
  10. 什么是uuid以及uuid在java中的使用