Linux/Raspberry Pi4下.NET 6 USB通信报错:UsbDevice无OpenUsbDevice定义
问题与解决方案
问题背景
现有一款可通过Windows平台C#(HID)应用通信的小型设备,需在Linux或Raspberry Pi4上实现USB通信。使用跨平台库LibUsbDotNet开发应用时,出现错误CS0117:'UsbDevice' does not contain a definition for 'OpenUsbDevice',寻求适用于Linux平台的.NET 6 USB库。
报错代码片段:
// 旧的LibUsbDotNet用法(已过时) UsbDeviceFinder finder = new UsbDeviceFinder(0x1234, 0x5678); UsbDevice usbDevice = UsbDevice.OpenUsbDevice(finder);
错误原因
LibUsbDotNet的API在新版本中发生了变更,UsbDevice.OpenUsbDevice这个静态方法已被移除,旧版示例代码不再适用。
适用于Linux平台的.NET 6 USB库推荐
1. 修正LibUsbDotNet的用法
如果坚持使用LibUsbDotNet,可改用新版本的API来查找并打开设备:
using LibUsbDotNet; using LibUsbDotNet.Main; using System.Linq; class Program { static void Main(string[] args) { // 替换为设备的Vendor ID和Product ID var vendorId = 0x1234; var productId = 0x5678; // 获取所有匹配的USB设备 var devices = UsbDevice.AllDevices.Where(d => d.Info.VendorId == vendorId && d.Info.ProductId == productId); UsbDevice usbDevice = null; foreach (var dev in devices) { try { dev.Open(); usbDevice = dev; break; } catch (UsbException ex) { Console.WriteLine($"打开设备失败: {ex.Message}"); } } if (usbDevice == null) { Console.WriteLine("未找到目标USB设备"); return; } // 在这里执行设备操作 Console.WriteLine("设备已成功打开"); // 关闭设备 usbDevice.Close(); } }
2. Usb.Net(推荐,跨平台HID/USB支持)
你已经引用了Usb.Net库,它是专门为跨平台USB/HID通信设计的,对Linux和Raspberry Pi支持良好,API更简洁:
using Usb.Net; using System.Threading.Tasks; using System.Linq; class Program { static async Task Main(string[] args) { // 替换为设备的Vendor ID和Product ID var vendorId = 0x1234; var productId = 0x5678; // 创建设备工厂 var factory = new UsbDeviceFactory(); // 查找并连接设备 using var device = await factory.GetDeviceAsync(vendorId, productId); if (device == null) { Console.WriteLine("未找到目标设备"); return; } await device.InitializeAsync(); // 示例:发送数据 var writeBuffer = new byte[] { 0x01, 0x02, 0x03 }; await device.WriteAsync(writeBuffer); // 示例:读取数据 var readBuffer = new byte[64]; var bytesRead = await device.ReadAsync(readBuffer); Console.WriteLine($"读取到 {bytesRead} 字节数据"); } }
注意:在Linux上需要确保用户有USB设备的访问权限,可通过udev规则配置,比如创建/etc/udev/rules.d/50-yourdevice.rules文件,内容为:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", MODE="0666"
然后重新加载udev规则:sudo udevadm control --reload-rules && sudo udevadm trigger
3. HidLibrary(针对HID设备)
如果你的设备是HID类设备,HidLibrary是更专注的选择,跨平台支持Linux:
using HidLibrary; using System.Linq; class Program { static void Main(string[] args) { var vendorId = 0x1234; var productId = 0x5678; var device = HidDevices.Enumerate(vendorId, productId).FirstOrDefault(); if (device == null) { Console.WriteLine("未找到HID设备"); return; } device.OpenDevice(); // 发送数据(HID报告通常为64字节,首字节为报告ID,无需则设为0) var writeData = new byte[64]; writeData[0] = 0x00; writeData[1] = 0x01; device.Write(writeData); // 读取数据 device.ReadData(data => { Console.WriteLine($"读取到数据: {BitConverter.ToString(data.Data)}"); }); device.CloseDevice(); } }
内容的提问来源于stack exchange,提问作者skt
相关产品推荐
相关产品推荐

