Список доступных COM-портов с Python
Я ищу простой способ перечислить весь доступный COM-порт на ПК.
Я нашел этот метод, но он специфичен для Windows: Список последовательных портов (COM) в Windows?
Я использую Python 3 с pySerial на ПК с Windows 7.
Я нашел в pySerial API (http://pyserial.sourceforge.net/pyserial_api.html) функцию serial.tools.list_ports.comports()
, которая перечисляет COM-порты (именно то, что я хочу).
import serial.tools.list_ports
print(list(serial.tools.list_ports.comports()))
Но похоже, что это не сработает. Когда мой USB-шлюз COM подключен к ПК (я вижу COM5 в диспетчере устройств), этот COM-порт не включен в список, возвращаемый list_ports.comports()
. Вместо этого я получаю только COM4, который, кажется, подключен к модему (я не вижу его в разделе COM & LPT диспетчера устройств)!
Вы знаете, почему это не работает? У вас есть другое решение, которое не является специфичным для системы?
Ответы
Ответ 1
Это код, который я использую.
Успешно протестирован на Windows 8.1 x64, Windows 10 x64, Mac OS X 10.9.x/10.10.x/10.11.x и Ubuntu 14.04/14.10/15.04/15.10 с Python 2 и Python 3.
import sys
import glob
import serial
def serial_ports():
""" Lists serial port names
:raises EnvironmentError:
On unsupported or unknown platforms
:returns:
A list of the serial ports available on the system
"""
if sys.platform.startswith('win'):
ports = ['COM%s' % (i + 1) for i in range(256)]
elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
# this excludes your current terminal "/dev/tty"
ports = glob.glob('/dev/tty[A-Za-z]*')
elif sys.platform.startswith('darwin'):
ports = glob.glob('/dev/tty.*')
else:
raise EnvironmentError('Unsupported platform')
result = []
for port in ports:
try:
s = serial.Serial(port)
s.close()
result.append(port)
except (OSError, serial.SerialException):
pass
return result
if __name__ == '__main__':
print(serial_ports())
Ответ 2
Вы можете использовать:
python -c "import serial.tools.list_ports;print serial.tools.list_ports.comports()"
Отфильтровать порт знает:
python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != 'n/a']"
Подробнее см. здесь:
https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.list_ports
Ответ 3
Возможная доработка превосходного ответа Томаса на то, чтобы Linux и, возможно, OSX также попытались открыть порты и вернуть только те, которые можно было открыть. Это связано с тем, что Linux, по крайней мере, перечисляет лодку портов как файлы в /dev/, которые не связаны ни с чем. Если вы работаете в терминале, /dev/tty - это терминал, в котором вы работаете, и открытие и закрытие может привести к вашей командной строке, поэтому glob не предназначен для этого. Код:
# ... Windows code unchanged ...
elif sys.platform.startswith ('linux'):
temp_list = glob.glob ('/dev/tty[A-Za-z]*')
result = []
for a_port in temp_list:
try:
s = serial.Serial(a_port)
s.close()
result.append(a_port)
except serial.SerialException:
pass
return result
Эта модификация кода Thomas была протестирована только на Ubuntu 14.04.
Ответ 4
Доступны несколько параметров:
Вызовите QueryDosDevice с NULL lpDeviceName, чтобы перечислить все устройства DOS. Затем используйте CreateFile и GetCommConfig с каждым именем устройства, чтобы выяснить, является ли он последовательным портом.
Вызвать SetupDiGetClassDevs с помощью ClassGuid GUID_DEVINTERFACE_COMPORT.
WMI также доступен для программ C/С++.
Там какой-то разговор о win32 newsgroup и CodeProject, er, project.
Ответ 5
уточнение moylop260:
import serial.tools.list_ports
list = serial.tools.list_ports.comports()
connected = []
for element in list:
connected.append(element.device)
print("Connected COM ports: " + str(connected))
Здесь перечислены порты, которые существуют на оборудовании, включая те, которые используются. В списке имеется гораздо больше информации, за документация по инструментам pyserial