Liste des ports com disponibles avec Python

je cherche une méthode simple pour lister tous les port com disponibles sur un PC.

j'ai trouvé cette méthode, mais elle est spécifique à Windows: "151960920 l'Inscription en série (COM) ports sur Windows?

j'utilise Python 3 avec pySerial sur un PC Windows 7.

j'ai trouvé dans L'API pySerial ( http://pyserial.sourceforge.net/pyserial_api.html ) une fonction serial.tools.list_ports.comports() qui liste com ports (exactement ce que je veux).

import serial.tools.list_ports
print(list(serial.tools.list_ports.comports()))

Mais il semble que cela ne fonctionne pas. Lorsque ma passerelle USB to COM est connectée au PC (je vois le COM5 dans le Device Manager), ce port COM n'est pas inclus dans la liste retournée par list_ports.comports() . Au lieu de cela, je ne reçois COM4 qui semble être connecté à un modem (Je ne le vois pas dans la section COM&LPT de Device Manager)!

savez-vous pourquoi ça ne marche pas? Avez-vous une autre solution qui n'est pas le système spécifique?

54
demandé sur Mark Amery 2012-08-23 15:25:30

6 réponses

C'est le code que j'utilise.

Testé avec succès sur Windows 8.1 x64, Windows 10 x64, Mac OS X 10.9.x / 10.10.x / 10.11.X et Ubuntu 14.04 / 14.10 / 15.04 / 15.10 avec Python 2 et 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())
110
répondu Thomas 2015-11-11 16:56:28

vous pouvez utiliser:

python -c "import serial.tools.list_ports;print serial.tools.list_ports.comports()"

filtre de know port: python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != 'n/a']"

voir plus d'informations ici: https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.list_ports

20
répondu moylop260 2015-11-12 04:03:34

un raffinement possible à L'excellente réponse de Thomas est D'avoir Linux et peut-être OSX aussi essayer d'ouvrir les ports et de retourner seulement ceux qui pourraient être ouverts. C'est parce que Linux, au moins, Liste un chargement de ports comme fichiers dans /dev/ qui ne sont connectés à rien. Si vous êtes dans un terminal, /dev/tty est le terminal dans lequel vous travaillez et l'ouverture et la fermeture il peut Gaffer sur votre ligne de commande, donc le glob est conçu pour ne pas faire cela. Code:

    # ... 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

cette modification au code de Thomas a été testée sur Ubuntu 14.04 seulement.

11
répondu Ngerf 2016-02-05 04:05:15

raffinement sur moylop260 'S réponse:

import serial.tools.list_ports
comlist = serial.tools.list_ports.comports()
connected = []
for element in comlist:
    connected.append(element.device)
print("Connected COM ports: " + str(connected))

cette liste énumère les ports qui existent dans le matériel, y compris ceux qui sont utilisés. Beaucoup plus d'information existe dans la liste, par la documentation des outils pyserial

5
répondu grambo 2018-04-12 14:43:09

plusieurs options sont disponibles:

Appel QueryDosDevice avec une valeur NULL lpDeviceName à la liste tous les périphériques. Ensuite, utilisez CreateFile et GetCommConfig avec chaque nom de périphérique à tour de rôle pour déterminer si c'est un port série.

Call SetupDiGetClassDevs with a ClassGuid of GUID_DEVINTERFACE_COMPORT.

WMI est également disponible pour Programmes C/C++ .

il y a une conversation sur le win32 newsgroup et un projet Codeprojet, er, projet .

1
répondu Hip Hip Array 2012-08-23 11:29:38

s'il vous plaît, essayez ce code:

import serial
ports = serial.tools.list_ports.comports(include_links=False)
for port in ports :
    print(port.device)

tout d'abord, vous devez importer le paquet pour la communication de port série, so:

import serial

ensuite vous créez la liste de tous les ports série actuellement disponibles:

ports = serial.tools.list_ports.comports(include_links=False)

et puis, en marchant le long de la liste entière, vous pouvez par exemple imprimer les noms de ports:

for port in ports :
    print(port.device)

c'est juste un exemple comment obtenir la liste des ports et imprimer leurs noms, mais il y a d'autres options que vous pouvez faire avec ces données. Il suffit d'essayer d'imprimer différentes variantes après

port.

0
répondu Alexander Lyapin 2018-09-25 21:19:11