【沧海拾昧】使用LibUsbDotNet进行Windows/Ubuntu跨平台串口管理

发布于:2025-08-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

#C0502


沧海茫茫千钟粟,且拾吾昧一微尘

——《沧海拾昧集》@CuPhoenix


【阅前敬告】
沧海拾昧集仅做个人学习笔记之用,所述内容不专业不严谨不成体系
【如有问题必是本集记录有谬,切勿深究】


前言

  在使用 .Net 的跨平台框架(如 Avalonia)进行 Windows / Ubuntu 系统的软件开发时,有时需要针对串口设备进行读取与管理。使用各平台的原生方法进行条件编译过于繁琐,因此可以引入 LibUsbDotNet 库实现这一功能。 LibUsbDotNet 库是跨平台 USB 用户模式库 libusb 的 .NET 版本。

  本文记录了使用 LibUsbDotNet 在 Windows / Ubuntu 平台下读取串口的方法和使用过程中可能存在的问题。


一、测试环境准备

  为演示使用 LibUsbDotNet 在 Windows / Ubuntu 平台下读取串口的方法,本例的实现功能与准备如下:

实现功能:

  • 使用 LibUsbDotNet 库读取设备所接入的 USB 设备列表,显示设备的Vid、Pid,并判断 Vid = 0x1a86 的设备是否连接。

软件版本:

  • Windows 11 家庭中文版;
  • Ubuntu 22.04;
  • LibUsbDotNet v2.2.75(通过 NuGet 包管理器下载);
  • System.IO.Ports v9.0.8(通过 NuGet 包管理器下载);
  • Filter Wizard(Windows 平台需要额外安装,点击下载);
  • libusb-v1.0(Ubuntu 平台需额外安装,点击下载);

硬件说明:

  • 用于测试的 USB 设备是 CH340,Vid = 0x1a86;
  • Ubuntu 系统安装在 Jetson Orin Nx(ARM64);

二、测试例程

  使用如下代码进行测试:

private void GetSerialPorts()
{
    label1.Text = "";
    
    try
    {
    	//	显示所有串口设备
    	UsbRegDeviceList allDev = UsbDevice.AllDevices;
	    foreach (UsbRegistry usbRegistry in allDev)
    	{
        	label1.Text += $"{usbRegistry.Vid:X4}:{usbRegistry.Pid}, {usbRegistry.FullName}\n";
    	}
    	
    	//  查找 Vid = 0x1a86, Pid = 0x7523 的设备
    	//UsbDeviceFinder finder = new UsbDeviceFinder(0x1a86,0x7523);
	    //using (UsbDevice device = UsbDevice.OpenUsbDevice(finder))
	    //{
    	//    if (device == null)
	    //    {
	    //        label1.Text += "No found.\n";
	    //    }
	    //    else {
	    //        label1.Text += "Found.\n";
	    //    }
	    //}
    }
    catch(Exception ex)
    {
    	label1.Text += $"{ex.Message}\n";
    }
    
    label1.Text += "end.\n";
}

说明:

  • label1 仅用作结果显示使用,可以根据实际情况进行替换;

三、Windows 平台设置

问题: 直接运行该程序,会报错找不到 “libusb-1.0.dll”。

  • 不推荐的解决方案:一些解决方案指出应该分别下载该 .dll 文件的 32 位与 64 位版本并复制到 C:\Windows\System 和 C:\Windows\SysWOW64 目录下,并在代码中设置:
UsbDevice.ForceLibUsbWinBack = true;

新问题: 这样做可能引发新的报错,使用了错误的 .dll 导致不匹配或溢出。

  • 推荐的解决方案:安装 Filter Wizard(点击下载),使用 Filter Wizard 安装串口设备。

在这里插入图片描述

进入 Filter Wizard,选择 Install a device filter,然后 Next

在这里插入图片描述

根据需求选择对应的USB设备,然后选择 Install
  • 在 Windows 平台下即可正确识别到对应串口设备。

在这里插入图片描述

识别到 CH340 设备

四、Ubuntu 平台设置

1、libusb 安装

问题: libusb-1.0 未安装.

  • 解决方案:安装 libusb-1.0,点击进入 官方网站(http://libusb.info),或 点击下载 v1.0.29 版本。
    • 将压缩包解压,然后在解压后得到的文件夹 libusb-1.0.29 内打开终端,依次执行 ./configuremakesudo make install 指令进行安装。
    • 安装完成后,可以通过 dpkg -l | grep libusb-1.0 指令确认是否安装成功。

2、libusb-1.0 library not found

问题: 找不到 libusb-1.0 library.

  • libusb-1.0 library not found.this is often an indication that libsub was installed to ‘/usr/local/lib’ adn mono.net is not looking for it there,to resolve this,add the path ‘/usr/local/lib’to’/ect/Id.so.conf’and run ‘Idconfig’ as root
  • 安装后运行例程代码,可能会抛出 libusb-1.0 library not found 异常,这是因为 libusb 的安装路径 /usr/local/lib 不在 Mono 系统默认的动态链接库搜索路径中。
  • 解决方案:按所抛出异常中的提示,使用指令 sudo gedit /ect/ld.so.conf 打开 /ect/ld.so.conf 文件进行编辑,在文件中增加一行:
include /usr/local/lib

在这里插入图片描述

修改 /ect/ld.so.conf 文件
  • 再次运行例程,即可成功获得所设备所连接的串口设备了。

在这里插入图片描述

识别到 CH340 设备

3、不具备串口访问权限

问题: 用户所在用户组不具有串口访问权限.

  • 解决方案:使用 sudo gpasswd -- add <username> dialout 指令,将当前用户(将指令中的 <username> 替换为当前用户的用户名)加入 dialout 用户组,然后重启设备,即可正常打开串口进行读写。

敬谢诸君。



网站公告

今日签到

点亮在社区的每一天
去签到