我在读取点亮的串行端口时遇到问题。当程序到达 CommPortIdentifier.getPortIdentifier() 时,它卡住了将近 5 分钟。我观察到延迟可能是由于扫描系统中的所有端口。那么如何避免这 5 分钟的延迟呢?
2 回答
如何扫描可用端口?
例如,下面的代码将返回可用串行端口的字符串列表:
public List<String> getAvailablePorts() {
List<String> list = new ArrayList<String>();
Enumeration portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
list.add(portId.getName());
}
}
return list;
}
编辑:由于在评论中挖掘了实际的解决方案,我在这里添加它:
看来commPortIdentifier.getPortIdentifier(portName)在某些情况下确实会重新扫描端口;快速解决方法是通过gnu.io.rxtx.SerialPorts系统属性手动设置固定端口列表。
这可能不适用于所有情况,但它对我有用,并且只需不到一秒钟即可获得我想要的端口。我从命令行使用了 Windows 的 devcon 实用程序。
devcon find "usb\vid_067B&PID_2303*"
这将列出连接 Prolific PL2303 USB 串行电缆的端口。然后我解析了结果。我通常得到的结果很少,因为我只在我的电脑上插入一两根电缆。
此代码可能不可移植且受限,但它非常适合我的目的,而且它的速度比使用 CommPortIdentifier.getPortIdentifiers() 快得多。
这是我的代码的一部分:
public List<String> getAvailablePorts() {
List<String> list = new ArrayList<String>();
String res="";
BufferedReader br;
String cmd;
Process proc;
try {
/*search for ports where Prolific PL2303 cable is attached*/
cmd = "devcon find \"usb\\vid_067B&PID_2303*\"";
proc = Runtime.getRuntime().exec(cmd);
/* parse the command line results*/
br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
do {
try {
res = br.readLine();
if (res == null)
break;
if (res.contains((CharSequence)("Prolific USB")))
list.add(res.substring(res.indexOf("(COM")+1, res.indexOf(")")));
} catch(Exception e) {
e.printStackTrace();
}
} while (!res.equals("null"));
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return list;
}
只需确保 devcon.exe 文件正确(32 位或 64 位)并且它位于应用程序可以访问的正确文件夹中。
这适用于 WinXP 和 Win7/8 64 位,但对于 32 位 Win7/8,应用程序可能需要以管理员权限启动(以管理员身份运行)。我在最终的可执行文件中添加了一个 .manifest 文件,因此无需在 32 位 Windows 上“右键单击并以管理员身份运行”。
在 Ubuntu 14.04 Linux 上,我使用了终端命令
ls /dev/ttyUSB*
列出 USB 串行端口,然后解析结果。