RXTX getPortIdentifiers () застрял - PullRequest
1 голос
/ 24 февраля 2011

У меня проблема с чтением списка последовательных портов. Когда программа достигает CommPortIdentifier.getPortIdentifier (), она застревает почти 5 минут.как я заметил, задержка может быть связана со сканированием всех портов в системе.Так как избежать этой 5-минутной задержки?

Ответы [ 2 ]

4 голосов
/ 24 февраля 2011

Как сканировать доступные порты?

Например, приведенный ниже код вернет список строк доступных последовательных портов:

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 .

1 голос
/ 06 августа 2015

Это может не относиться ко всем обстоятельствам, но оно работает для меня и занимает менее секунды, чтобы получить нужные порты.Я использовал утилиту devcon для Windows, основанную на командной строке.

devcon find "usb\vid_067B&PID_2303*"

В этом списке перечислены порты, к которым подключен кабель USB-Serial Prolific PL2303.Затем я проанализировал результат.Я обычно получаю мало результатов, потому что подключаю только один или два кабеля к своему компьютеру.

Этот код может быть не переносимым и ограниченным, но он хорошо подходит для моих целей и его скорость слишком высока, чем при использовании 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 и 64-битной Win7 / 8, но для 32-битной Win7 / 8 может потребоваться запуск приложения с правами администратора (запуск от имени администратора).Я добавил файл .manifest в свой окончательный исполняемый файл, поэтому нет необходимости «щелкать правой кнопкой мыши и запускать от имени администратора» в 32-битной Windows.

В Ubuntu 14.04 Linux я использовал команду терминала

ls /dev/ttyUSB*

, чтобы вывести список USB-последовательных портов и затем проанализировать результат.

...