1

我在读取点亮的串行端口时遇到问题。当程序到达 CommPortIdentifier.getPortIdentifier() 时,它卡住了将近 5 分钟。我观察到延迟可能是由于扫描系统中的所有端口。那么如何避免这 5 分钟的延迟呢?

4

2 回答 2

4

如何扫描可用端口?

例如,下面的代码将返回可用串行端口的字符串列表:

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系统属性手动设置固定端口列表。

于 2011-02-24T14:40:27.557 回答
1

这可能不适用于所有情况,但它对我有用,并且只需不到一秒钟即可获得我想要的端口。我从命令行使用了 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 串行端口,然后解析结果。

于 2015-08-06T18:08:52.050 回答