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 单个项目的设备枚举。
我正在尝试在 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 单个项目的设备枚举。