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
相关产品推荐
相关产品推荐

