You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:03:18