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

Linux Ubuntu下C#获取串口设备特定标识名称的方法

Linux下C#识别USB串口设备的特定名称方案

在Linux系统中,无法直接通过SerialPort类获取设备的厂商/型号名称,以下是几种可行的实现方式:

方法1:利用/dev/serial/by-id目录的符号链接

Linux会为USB串口设备在/dev/serial/by-id目录下创建带唯一标识的符号链接,链接名称包含厂商、型号等信息(例如usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0),且链接指向真实的/dev/ttyUSBx端口。

C#实现示例:

using System.IO;

var serialByIdDir = "/dev/serial/by-id";
if (Directory.Exists(serialByIdDir))
{
    foreach (var linkPath in Directory.GetFiles(serialByIdDir))
    {
        // 获取符号链接指向的真实串口路径
        var realPortPath = Path.GetFullPath(Path.Combine(serialByIdDir, Path.GetFileName(linkPath)));
        // 解析链接名称中的设备标识
        var deviceName = Path.GetFileName(linkPath).Split('-')[1].Replace('_', ' ');
        Console.WriteLine($"设备名称: {deviceName}, 对应端口: {realPortPath}");
    }
}

方法2:解析lsusb命令输出

通过调用lsusb命令获取设备的厂商和型号信息,再关联到对应的串口端口:

C#实现示例:

using System.Diagnostics;
using System.Linq;

var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = "lsusb",
        Arguments = "-v",
        RedirectStandardOutput = true,
        UseShellExecute = false,
        CreateNoWindow = true
    }
};
process.Start();
var output = process.StandardOutput.ReadToEnd();
process.WaitForExit();

// 解析输出,提取厂商、产品信息及总线/设备号,再关联串口端口
foreach (var deviceBlock in output.Split(new[] { "\n\n" }, StringSplitOptions.RemoveEmptyEntries))
{
    if (deviceBlock.Contains("Serial Port"))
    {
        var manufacturerLine = deviceBlock.Split('\n').FirstOrDefault(line => line.Contains("iManufacturer"));
        var productNameLine = deviceBlock.Split('\n').FirstOrDefault(line => line.Contains("iProduct"));
        
        var manufacturer = manufacturerLine?.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries).Last().Trim() ?? "Unknown";
        var product = productNameLine?.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries).Last().Trim() ?? "Unknown";
        
        // 可通过总线/设备号,在/sys/bus/usb/devices/[总线]-[设备]/tty/路径下找到对应串口
        Console.WriteLine($"厂商: {manufacturer}, 产品: {product}");
    }
}

方法3:读取sysfs文件系统的设备信息

直接访问/sys/class/tty下的设备节点,读取对应的厂商和产品信息:

C#实现示例:

using System.IO;

var ttyClassDir = "/sys/class/tty";
foreach (var ttyDir in Directory.GetDirectories(ttyClassDir))
{
    var ttyName = Path.GetFileName(ttyDir);
    if (ttyName.StartsWith("ttyUSB") || ttyName.StartsWith("ttyACM"))
    {
        // 读取厂商名称
        var manufacturerPath = Path.Combine(ttyDir, "device", "manufacturer");
        var manufacturer = File.Exists(manufacturerPath) ? File.ReadAllText(manufacturerPath).Trim() : "Unknown";
        
        // 读取产品名称
        var productPath = Path.Combine(ttyDir, "device", "product");
        var product = File.Exists(productPath) ? File.ReadAllText(productPath).Trim() : "Unknown";
        
        Console.WriteLine($"端口: /dev/{ttyName}, 厂商: {manufacturer}, 产品: {product}");
    }
}

注意事项

  • 以上方法需要程序具备读取/dev和/sys目录的权限,确保运行时用户有足够权限。
  • 不同设备的sysfs路径可能略有差异,需根据实际设备调整路径。

内容的提问来源于stack exchange,提问作者Oscar K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:15:38