单声道SerialPort.GetPortNames()实际连接?

时间:2016-06-16 12:43:55

标签: c# mono

我试图在Mono中使用SerialPort.GetPortNames()重新接收所有连接端口的数组,但它返回如下内容:

(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);
}

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

1 个答案:

答案 0 :(得分:2)

正如您在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。也许您可以找到最适合您需求的解决方案。

AFAIK直接在单声道中没有简单的方法,你必须更深入。

更新

在连接的FTDI设备中只有一个 / dev / ttyUSB0 项目的原因似乎非常明显。

在同一方法中,linux_style标志值由简单的查找确定:

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

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