31 votes

Quelle est la méthode multiplateforme d'énumération des ports série en Python (y compris les ports virtuels)?

Note: j'utilise Python 2.7, et pySerial pour les communications série.

J'ai trouvé cet article qui répertorie deux façons: http://www.zaber.com/wiki/Software/Python#Displaying_a_list_of_available_serial_ports

Cette méthode fonctionne sur Windows et Linux, mais parfois manque ports virtuels sous Linux:

import serial

def scan():
   # scan for available ports. return a list of tuples (num, name)
   available = []
   for i in range(256):
       try:
           s = serial.Serial(i)
           available.append( (i, s.portstr))
           s.close()
       except serial.SerialException:
           pass
   return available

print "Found ports:"
for n,s in scan(): print "(%d) %s" % (n,s)

Et ce qui ne fonctionne que sur Linux, mais comprend des ports virtuels:

import serial, glob

def scan():
   # scan for available ports. return a list of device names.
   return glob.glob('/dev/ttyS*') + glob.glob('/dev/ttyUSB*')

print "Found ports:"
for name in scan(): print name

Je suppose que je pourrais faire de la plateforme de détection de l'utilisation de la deuxième méthode (celle qui comprend les ports virtuels) lors de l'exécution sur Linux, et la première méthode lors de l'exécution de Windows, mais ce que sur Mac?

Comment dois-je énumérer les ports série virtuels (trop) peu importe la plate-forme?

Modifier

J'ai trouvé quelques questions pertinentes:

8voto

Chris Laplante Points 18060

C'est ce que j'utilise. C'est un mashup des méthodes que j'ai publiées ci-dessus. J'aimerais toujours voir de meilleures solutions.

 # A function that tries to list serial ports on most common platforms
def list_serial_ports():
    system_name = platform.system()
    if system_name == "Windows":
        # Scan for available ports.
        available = []
        for i in range(256):
            try:
                s = serial.Serial(i)
                available.append(i)
                s.close()
            except serial.SerialException:
                pass
        return available
    elif system_name == "Darwin":
        # Mac
        return glob.glob('/dev/tty*') + glob.glob('/dev/cu*')
    else:
        # Assume Linux or something else
        return glob.glob('/dev/ttyS*') + glob.glob('/dev/ttyUSB*')
 

7voto

Nandeep Mali Points 2715

bitpim eu un peu de code pour comscan sur de multiples plateformes. Probablement utile pour obtenir un code de sortir de là pour construire une plate-forme de serial port enumerator. Vous pouvez exécuter le code de détection directement en ligne de commande pour tester.

Lien vers le fichier source comscan.py.

Sous Linux, il ne semble pas détecter " /dev/ttyS ports. L'ajout de la ligne suivante en dessous de la ligne #378 travaillé:

("/dev/ttyS", "Standard Serial Port", "serial"),

L'auteur a fait, il est facile d'ajouter différents types d'identifiants pour les ports série.

Sous Mac, il a très bien fonctionné. (A un Arduino portée de main pour tester)

Dans Windows, il détecté correctement connecté, le port (pour la connecté FTDI connecteur). Nécessite pywin32.

Avec pyserial, j'ai essayé le suivant:

python -m serial.tools.list_ports

Ne semble pas fonctionner sur Windows. Fonctionne sur Mac. Fonctionne sur Linux.

Il est intéressant de voir la Plate-forme de la section de la documentation pour cette commande:

Platform :  Posix (/dev files)
Platform :  Linux (/dev files, sysfs and lsusb)
Platform :  Windows (setupapi, registry)

Je pense qu'une fusion des deux devrait donner une (presque) 100% fiable com port enumerator.

Edit: je l'ai Essayé tout ce qui précède dans Python 2.7.

4voto

Gerrat Points 9072

La fonction pyserial, serial.tools.list_ports , vous donne-t-elle ce que vous voulez?

0voto

Abe Karplus Points 2233

Je ne sais pas si vous êtes toujours à la recherche de réponses à cela, mais depuis que j'ai une solution de travail, je pensais que je poste ça. Voici la getports package dans le cadre de mon Arduino Enregistreur de Données de projet. Je l'ai testé à travailler sur Mac, au moins certains des saveurs de Linux et de Windows 7. Contrairement à bitpim de comscan, il n'utilise pas tous les modules de ne pas partir de la bibliothèque standard. Aussi, il n'utilise pas d' /dev d'expansion sur Linux ou Mac, donc renommer les règles ne devrait pas être un problème. (Sous Linux, il utilise sysfs et sur Mac il utilise IOKit.) Je ne sais pas si il détecte les ports série virtuels sous Linux, mais si ça ne marche pas, essayez de remplacer

sys_suffix = '/device/'

avec

sys_suffix = ''

en linuxgetports.py

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