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 ?

1voto

Ayoub Boulehfa Points 11

Essayez ce code

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

il retourne

COM1 - Port de communication (COM1)
COM5 - USB-SERIAL CH340 (COM5)

si vous voulez juste le nom du port par exemple COM1

import serial.tools.list_ports
for i in serial.tools.list_ports.comports():
    print(str(i).split(" ")[0])

il retourne

COM1
COM5

comme dans mon cas py 3.7 64bits

1voto

Ondřej Vacek Points 1

Ne fonctionne que sous Windows :

import winreg
import itertools

def serial_ports() -> list:
    path = 'HARDWARE\\DEVICEMAP\\SERIALCOMM'
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path)

    ports = []
    for i in itertools.count():
        try:
            ports.append(winreg.EnumValue(key, i)[1])
        except EnvironmentError:
            break

    return ports

if __name__ == "__main__":
    ports = serial_ports()

0voto

Hip Hip Array Points 4435

Plusieurs options sont disponibles :

Appelez QueryDosDevice avec un NULL lpDeviceName pour lister tous les périphériques DOS. Utilisez ensuite CreateFile et GetCommConfig avec chaque nom de périphérique tour à tour pour savoir 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 certaine conversation sur le groupe de discussion win32 et un CodeProject, euh, projet .

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