Это может не относиться ко всем обстоятельствам, но оно работает для меня и занимает менее секунды, чтобы получить нужные порты.Я использовал утилиту 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-последовательных портов и затем проанализировать результат.