web-dev-qa-db-fra.com

Liste des ports de communication disponibles avec Python

Je cherche une méthode simple pour répertorier tous les ports com disponibles sur un PC.

J'ai trouvé cette méthode, mais elle est spécifique à Windows: Liste des ports série (COM) sous Windows?

J'utilise Python 3 avec pySerial sur un ordinateur Windows 7.

J'ai trouvé dans l'API pySerial ( http://pyserial.sourceforge.net/pyserial_api.html ) une fonction serial.tools.list_ports.comports() qui répertorie 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 ça ne marche pas. Lorsque ma passerelle USB vers COM est connectée au PC (le COM5 apparaît dans le Gestionnaire de périphériques), ce port COM n'est pas inclus dans la liste renvoyée par 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)!

Savez-vous pourquoi cela ne fonctionne pas? Avez-vous une autre solution qui n'est pas spécifique au système?

62
doom

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 __== '__main__':
    print(serial_ports())
125
Thomas

Une excellente réponse à l'excellente réponse de Thomas consiste à faire en sorte que Linux et éventuellement OSX essayent également d'ouvrir des ports et de ne renvoyer que ceux qui pourraient être ouverts. En effet, Linux, du moins, répertorie une charge de bateaux en tant que fichiers dans/dev/qui ne sont connectés à rien. Si vous utilisez un terminal,/dev/tty est le terminal dans lequel vous travaillez et son ouverture et sa fermeture peuvent aller jusqu'à la ligne de commande, donc le glob est conçu pour ne pas le faire. 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 du code de Thomas a été testée sur Ubuntu 14.04 uniquement. 

11
Ngerf

raffinement sur la réponse de moylop260 :

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

Cela répertorie les ports qui existent dans le matériel, y compris ceux qui sont utilisés. Il y a beaucoup plus d'informations dans la liste, par la documentation de pyserial tools

5
grambo

Essentiellement mentionné dans la documentation pyserialhttps://pyserial.readthedocs.io/en/latest/tools.html#module-serial.tools.list_ports

import serial.tools.list_ports
ports = serial.tools.list_ports.comports()

for port, desc, hwid in sorted(ports):
        print("{}: {} [{}]".format(port, desc, hwid))

Résultat : 

COM1: port de communication (COM1) [ACPI\PNP0501\1]

COM7: port USB MediaTek (COM7) [USB VID: PID = 0E8D: 0003 SER = 6 LOCATION = 1-2.1]

3
Ozgur Oz

Plusieurs options sont disponibles:

Appelez QueryDosDevice avec un NULL lpDeviceName pour répertorier tous les périphériques DOS. Ensuite, utilisez CreateFile et GetCommConfig avec chaque nom de périphérique pour déterminer s’il s’agit d’un port série.

Appelez SetupDiGetClassDevs avec un ClassGuid de GUID_DEVINTERFACE_COMPORT.

WMI est également disponible pour les programmes C/C++ .

Il y a une conversation sur le newsgroup win32 et un CodeProject, euh, projet .

1
Hip Hip Array

solution à une ligne avec le package pySerial.

python -m serial.tools.list_ports
0
I am Learning...

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 un package pour la communication par port série, so:

import serial

vous créez ensuite 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 de port:

for port in ports :
    print(port.device)

Ceci est juste un exemple pour obtenir la liste des ports et imprimer leurs noms, mais vous pouvez faire d’autres options avec ces données. Essayez simplement d’imprimer différentes variantes après 

port.

0
Alexander Lyapin