#C0502
——《沧海拾昧集》@CuPhoenix
目录
前言
在使用 .Net 的跨平台框架(如 Avalonia)进行 Windows / Ubuntu 系统的软件开发时,有时需要针对串口设备进行读取与管理。使用各平台的原生方法进行条件编译过于繁琐,因此可以引入 LibUsbDotNet 库实现这一功能。 LibUsbDotNet 库是跨平台 USB 用户模式库 libusb 的 .NET 版本。
本文记录了使用 LibUsbDotNet 在 Windows / Ubuntu 平台下读取串口的方法和使用过程中可能存在的问题。
一、测试环境准备
为演示使用 LibUsbDotNet 在 Windows / Ubuntu 平台下读取串口的方法,本例的实现功能与准备如下:
实现功能:
- 使用 LibUsbDotNet 库读取设备所接入的 USB 设备列表,显示设备的Vid、Pid,并判断 Vid = 0x1a86 的设备是否连接。
软件版本:
硬件说明:
- 用于测试的 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 安装串口设备。
- 在 Windows 平台下即可正确识别到对应串口设备。
四、Ubuntu 平台设置
1、libusb 安装
问题: libusb-1.0 未安装.
- 解决方案:安装 libusb-1.0,点击进入 官方网站(http://libusb.info),或 点击下载 v1.0.29 版本。
- 将压缩包解压,然后在解压后得到的文件夹 libusb-1.0.29 内打开终端,依次执行
./configure
、make
、sudo make install
指令进行安装。 - 安装完成后,可以通过
dpkg -l | grep libusb-1.0
指令确认是否安装成功。
- 将压缩包解压,然后在解压后得到的文件夹 libusb-1.0.29 内打开终端,依次执行
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
- 再次运行例程,即可成功获得所设备所连接的串口设备了。
3、不具备串口访问权限
问题: 用户所在用户组不具有串口访问权限.
- 解决方案:使用
sudo gpasswd -- add <username> dialout
指令,将当前用户(将指令中的 <username> 替换为当前用户的用户名)加入 dialout 用户组,然后重启设备,即可正常打开串口进行读写。
敬谢诸君。