Подтвердить что ты не робот

Список доступных 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 диспетчера устройств)!

Вы знаете, почему это не работает? У вас есть другое решение, которое не является специфичным для системы?

4b9b3361

Ответ 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