我试图在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);
}
所以我的问题是如何找出哪些端口与我的计算机实际连接?
答案 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
。这会影响上面描述的设备枚举,它返回单个项目。