125 votes

Lister les ports de communication disponibles avec Python

Je cherche une méthode simple pour lister tous les ports de communication disponibles sur un PC.

J'ai trouvé cette méthode mais elle est spécifique à Windows : Lister les ports série (COM) sous 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 les ports de communication (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 vers COM est connectée au PC (je vois le COM5 dans le Gestionnaire de périphériques), ce port COM n'est pas inclus dans la liste renvoyée par la fonction list_ports.comports() . Au lieu de cela, je n'obtiens que COM4 qui semble être connecté à un modem (je ne le vois pas dans la section COM&LPT du gestionnaire de périphériques) !

Tu sais pourquoi ça ne marche pas ? Avez-vous une autre solution qui ne soit pas spécifique au système ?

10voto

grambo Points 168

Raffinement sur moylop260 La réponse de la Commission :

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))

Ceci liste les ports qui existent dans le matériel, y compris ceux qui sont utilisés. Beaucoup plus d'informations existent dans la liste, par la documentation des outils pyserial

6voto

Malcolm Who Points 392

Probablement en retard, mais ça pourrait aider quelqu'un dans le besoin.

import serial.tools.list_ports

class COMPorts:

    def __init__(self, data: list):
        self.data = data

    @classmethod
    def get_com_ports(cls):
        data = []
        ports = list(serial.tools.list_ports.comports())

        for port_ in ports:
            obj = Object(data=dict({"device": port_.device, "description": port_.description.split("(")[0].strip()}))
            data.append(obj)

        return cls(data=data)

    @staticmethod
    def get_description_by_device(device: str):
        for port_ in COMPorts.get_com_ports().data:
            if port_.device == device:
                return port_.description

    @staticmethod
    def get_device_by_description(description: str):
        for port_ in COMPorts.get_com_ports().data:
            if port_.description == description:
                return port_.device

class Object:
    def __init__(self, data: dict):
        self.data = data
        self.device = data.get("device")
        self.description = data.get("description")

if __name__ == "__main__":
    for port in COMPorts.get_com_ports().data:
        print(port.device)
        print(port.description)

    print(COMPorts.get_device_by_description(description="Arduino Leonardo"))
    print(COMPorts.get_description_by_device(device="COM3"))

4voto

Alexander Lyapin Points 130

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 par port série, donc :

import serial

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

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

et ensuite, en parcourant toute la liste, vous pouvez par exemple imprimer les noms des 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 quelques autres options que vous pouvez faire avec ces données. Essayez simplement d'imprimer différentes variantes après

port.

4voto

Quelque chose de simple mais que j'utilise beaucoup.

import serial.tools.list_ports as ports

com_ports = list(ports.comports()) # create a list of com ['COM1','COM2'] 
    for i in com_ports:            
        print(i.device) # returns 'COMx'

2voto

Une chose à noter, les codes comme celui-ci :

for i in serial.tools.list_ports.comports():
print(i) 

Retournez les éléments suivants :

COM7 - Standard Serial over Bluetooth link (COM7) COM1 - Communications Port (COM1) COM8 - Standard Serial over Bluetooth link (COM8) COM4 - USB-SERIAL CH340 (COM4)

Si vous voulez que les ports soient listés dans l'ordre, et seulement ceux qui sont disponibles pour vous, essayez :(credit to tfeldmann)

   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

Le résultat est le suivant :

['COM1', 'COM4', 'COM8']

Contrairement au premier exemple, où le résultat était ['COM7', 'COM1', 'COM8', 'COM4'], cette fois, j'obtiens tous les ports de communication dans l'ordre, et seulement ceux qui sont disponibles. Très pratique si vous avez besoin de les avoir dans l'ordre, et testé pour voir s'ils sont disponibles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X