Mono SerialPort.GetPortNames() 实际连接了吗?

Mono SerialPort.GetPortNames() actually connected?

我正在尝试在 Mono 中使用 SerialPort.GetPortNames() 接收所有连接端口的数组,但它 returns 是这样的:

(Mac 但是在 Linux 上应该是一样的)

ApfelBuch:~ janwiesemann$ mono "/Users/janwiesemann/Desktop/ports/ports/bin/Debug/ports.exe"
/dev/tty.Bluetooth-Incoming-Port
/dev/ttyp0
/dev/ttyp1
/dev/ttyp2
/dev/ttyp3
/dev/ttyp4
...
/dev/ttywc
/dev/ttywd
/dev/ttywe
/dev/ttywf

Press any key to continue...

使用的代码:

string[] ports = SerialPort.GetPortNames();

foreach (string p in ports)
{
    Console.WriteLine (p);
}

所以我的问题是如何找出哪些端口实际连接到我的计算机?

正如您在 mono source code 中所见,SerialPort.GetPortNames() 方法仅枚举 /dev/tty* 节点:

string[] ttys = Directory.GetFiles("/dev/", "tty*");
...
foreach (string dev in ttys) {
    if (linux_style){
        if (dev.StartsWith("/dev/ttyS") || dev.StartsWith("/dev/ttyUSB") || dev.StartsWith("/dev/ttyACM"))
            serial_ports.Add (dev);
    } else {
        if (dev != "/dev/tty" && dev.StartsWith ("/dev/tty") && !dev.StartsWith ("/dev/ttyC"))
            serial_ports.Add (dev);
    }
}

这就是为什么您在输出中得到所有这些 tty* 设备的原因。 但是要确定它们中的哪一个实际上对应于您机器上的(连接的)串行端口并不那么容易。

你可以看看this的回答。他们使用 Unix dmesg 命令,然后使用 grep 来找出哪些设备实际上是串口。他们甚至试图弄清楚哪个串行端口也连接在另一侧。

$dmesg | grep ttyS
[    0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A 
[    0.892626] 00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A 
[    0.915797] 0000:01:01.0: ttyS4 at I/O 0x9800 (irq = 19) is a ST16650V2 
[    0.936942] 0000:01:01.1: ttyS5 at I/O 0x9c00 (irq = 18) is a ST16650V2

或者,您可以解析 /proc/tty/drivers 文件,如 this answer.

中所述

有几个 similar questions 关于它。或许您可以找到最适合您需求的解决方案。

据我所知,没有直接在单声道中执行此操作的简单方法,您必须更深入。


更新

连接 FTDI 设备时只有一个 /dev/ttyUSB0 项的原因似乎很明显。

同样的方法,linux_style标志值通过简单的查找来确定:

if (dev.StartsWith("/dev/ttyS") || dev.StartsWith("/dev/ttyUSB") || dev.StartsWith("/dev/ttyACM")) {
    linux_style = true;
    break;
}

因此,如果有 ttyUSB* 设备可用,则此标志将设置为 true。这会影响上述 returns 单个项目的设备枚举。