Ich suche nach einer einfachen Methode, um alle verfügbaren COM-Ports auf einem PC aufzulisten.
Ich habe diese Methode gefunden, aber sie ist Windows-spezifisch: Auflisten von seriellen (COM) Ports unter Windows?
Ich verwende Python 3 mit pySerial auf einem Windows 7-PC.
Ich habe in der pySerial-API ( http://pyserial.sourceforge.net/pyserial_api.html ) eine Funktion gefunden serial.tools.list_ports.comports()
, die COM-Ports auflistet (genau das, was ich will).
import serial.tools.list_ports
print(list(serial.tools.list_ports.comports()))
Aber es scheint, dass es nicht funktioniert. Wenn mein USB-zu-COM-Gateway mit dem PC verbunden ist (ich sehe den COM5 im Geräte-Manager), ist dieser COM-Anschluss nicht in der von zurückgegebenen Liste enthalten list_ports.comports()
. Stattdessen bekomme ich nur COM4, das an ein Modem angeschlossen zu sein scheint (ich sehe es nicht im COM & LPT-Bereich des Geräte-Managers)!
Weißt du warum es nicht funktioniert? Haben Sie eine andere Lösung, die nicht systemspezifisch ist?
comports()
in dieser Frage beschriebene Fehler in der Funktion von pySerial (ohne genaue Informationen zur Reproduktion) wahrscheinlich behoben wurde. Versuchen Sie es zunächstimport serial.tools.list_ports; print([comport.device for comport in serial.tools.list_ports.comports()])
. Nur wenn dies für Sie nicht funktioniert, sind die folgenden Antworten für Sie relevant.ListPortInfo
Objekte generiert . Um die Namen oder andere Informationen zu erhalten, müssen Sie beim Erstellen der Liste die Attribute dieser Objekte verwenden. Siehe: pythonhosted.org/pyserial/…Antworten:
Dies ist der Code, den ich benutze.
Erfolgreich getestet unter Windows 8.1 x64, Windows 10 x64, Mac OS X 10.9.x / 10.10.x / 10.11.x und Ubuntu 14.04 / 14.10 / 15.04 / 15.10 mit Python 2 und 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())
quelle
except OSError: pass
beim Testen unter OSX hinzufügen .serial_ports()
Funktion nicht aufgelistet (und würde keine Ausnahme auslösen). Warum verwenden Sie nichtclose()
die von pyserial bereitgestellte Funktion, um einen COM-Port zu trennen?Sie können verwenden:
python -c "import serial.tools.list_ports;print serial.tools.list_ports.comports()"
Filtern nach bekanntem Port:
python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != 'n/a']"
Weitere Informationen finden Sie hier: https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.list_ports
quelle
('COM114', 'USB Serial Port (COM114)', 'FTDIBUS\\VID_0403+PID_6001+7&2A8DEF85&0&2\\0000')
können Sie nach Vendor USB PID / VID filtern, was genau das ist, wonach ich gesucht habe.('/dev/ttyACM1', 'ttyACM1', 'USB VID:PID=0483:5752 SNR=8D7B179D5354')
Tolle Lösung. Danke!serial.tools.list_ports.comports()
und erklärte bereits , dass es auf der Plattform des Fragestellers nicht richtig funktionierte. Sie fügen keine Informationen hinzu, die nicht in Frage kamen.Grundsätzlich wird dies in der pyserialen Dokumentation https://pyserial.readthedocs.io/en/latest/tools.html#module-serial.tools.list_ports erwähnt
import serial.tools.list_ports ports = serial.tools.list_ports.comports() for port, desc, hwid in sorted(ports): print("{}: {} [{}]".format(port, desc, hwid))
Ergebnis:
COM1: Kommunikationsanschluss (COM1) [ACPI \ PNP0501 \ 1]
COM7: MediaTek-USB-Anschluss (COM7) [USB-VID: PID = 0E8D: 0003 SER = 6 LOCATION = 1-2.1]
quelle
Eine mögliche Verfeinerung von Thomas 'hervorragender Antwort besteht darin, dass Linux und möglicherweise OSX auch versuchen, Ports zu öffnen und nur diejenigen zurückzugeben, die geöffnet werden könnten. Dies liegt daran, dass Linux zumindest eine Schiffsladung von Ports als Dateien in / dev / auflistet, die mit nichts verbunden sind. Wenn Sie in einem Terminal ausgeführt werden, ist / dev / tty das Terminal, in dem Sie arbeiten, und das Öffnen und Schließen kann Ihre Befehlszeile beschädigen. Daher ist der Glob so konzipiert, dass er dies nicht tut. 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
Diese Änderung an Thomas 'Code wurde nur unter Ubuntu 14.04 getestet.
quelle
Verfeinerung der Antwort von 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))
Hier werden die in der Hardware vorhandenen Ports aufgelistet, einschließlich der verwendeten. In der Liste sind in der Dokumentation zu den Pyserial-Tools viel mehr Informationen enthalten
quelle
list
, und Ihre Konstruktion mit vier Anweisungen vonconnected
könnte deutlich prägnanter geschrieben werden alsconnected = [port.device for port in serial.tools.list_ports.comports()]
.Einzeilige Lösung mit pySerial-Paket.
quelle
Bitte versuchen Sie diesen Code:
import serial ports = serial.tools.list_ports.comports(include_links=False) for port in ports : print(port.device)
Zunächst müssen Sie das Paket für die Kommunikation über die serielle Schnittstelle importieren.
import serial
Anschließend erstellen Sie eine Liste aller derzeit verfügbaren seriellen Schnittstellen:
ports = serial.tools.list_ports.comports(include_links=False)
Wenn Sie dann die gesamte Liste durchgehen, können Sie beispielsweise Portnamen drucken:
for port in ports : print(port.device)
Dies ist nur ein Beispiel, wie Sie die Liste der Ports abrufen und deren Namen drucken können. Es gibt jedoch einige andere Optionen, die Sie mit diesen Daten ausführen können. Versuchen Sie einfach, verschiedene Varianten danach zu drucken
quelle
Es stehen mehrere Optionen zur Verfügung:
Rufen Sie QueryDosDevice mit einem NULL-lpDeviceName auf, um alle DOS-Geräte aufzulisten. Verwenden Sie dann CreateFile und GetCommConfig mit jedem Gerätenamen, um herauszufinden, ob es sich um eine serielle Schnittstelle handelt.
Rufen Sie SetupDiGetClassDevs auf mit einer ClassGuid von GUID_DEVINTERFACE_COMPORT auf.
WMI ist auch für C / C ++ - Programme verfügbar .
Es gibt einige Gespräche in der Win32-Newsgroup und in einem CodeProject- Projekt .
quelle
Versuchen Sie diesen Code
import serial.tools.list_ports for i in serial.tools.list_ports.comports(): print(i)
es kehrt zurück
wenn Sie nur den Namen des Ports nicht kennen, zum Beispiel COM1
import serial.tools.list_ports for i in serial.tools.list_ports.comports(): print(str(i).split(" ")[0])
es kehrt zurück
wie in meinem Fall py 3.7 64bits
quelle
Funktioniert nur unter 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()
quelle