私は、PCで利用可能なすべてのCOMポートをリストする簡単な方法を探しています。
私はこの方法を見つけましたが、Windows固有です: Windows上のシリアル(COM)ポートを一覧表示しますか?
Windows 7 PCでpySerialでPython 3を使用しています。
PySerial API( http://pyserial.sourceforge.net/pyserial_api.html )で、comポートをリストする関数serial.tools.list_ports.comports()
を見つけました(正確に欲しいものです)。
import serial.tools.list_ports
print(list(serial.tools.list_ports.comports()))
しかし、うまくいかないようです。 USB to COMゲートウェイがPCに接続されている場合(デバイスマネージャーにCOM5が表示されます)、このCOMポートはlist_ports.comports()
によって返されるリストに含まれません。代わりに、モデムに接続されているように見えるCOM4のみを取得します(デバイスマネージャーのCOM&LPTセクションに表示されません)。
なぜ機能しないのか知っていますか?システム固有ではない別のソリューションがありますか?
これは私が使用するコードです。
Windows 8.1 x64、Windows 10 x64、Mac OS X 10.9.x/10.10.x/10.11.xおよびUbuntu 14.04/14.10/15.04/15.10でPython 2と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())
次を使用できます。
python -c "import serial.tools.list_ports;print serial.tools.list_ports.comports()"
既知のポートによるフィルター:python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != 'n/a']"
詳細はこちらをご覧ください: https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.list_ports
Thomasの優れた答えに対する可能な改良点は、Linuxおよび場合によってはOSXもポートをオープンして、オープン可能なポートのみを返そうとすることです。これは、少なくともLinuxが、何も接続されていない/ dev /のファイルとしてポートのボートロードをリストするためです。ターミナルで実行している場合、/ dev/ttyは作業中のターミナルであり、このターミナルを開いたり閉じたりすることでコマンドラインを使い果たすことができるため、globはそれを行わないように設計されています。コード:
# ... 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
Thomasのコードに対するこの変更は、Ubuntu 14.04でのみテストされています。
moylop26 の答えの改良:
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))
これには、使用中のポートを含む、ハードウェアに存在するポートがリストされます。 pyserial tools documentation により、リストにはさらに多くの情報があります。
これは、pyserialドキュメントで基本的に言及されていますhttps://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))
結果:
COM1:通信ポート(COM1)[ACPI\PNP0501\1]
COM7:MediaTek USBポート(COM7)[USB VID:PID = 0E8D:0003 SER = 6 LOCATION = 1-2.1]
pySerialパッケージを使用した1行のソリューション。
python -m serial.tools.list_ports
いくつかのオプションが利用可能です:
NULL lpDeviceNameを指定して QueryDosDevice を呼び出し、すべてのDOSデバイスをリストします。次に、CreateFileと GetCommConfig を各デバイス名で順番に使用して、シリアルポートかどうかを判断します。
GUID-DEVINTERFACE_COMPORTのClassGuidで SetupDiGetClassDevs を呼び出します。
win32ニュースグループ とCodeProject、er、 project についていくつかの会話があります。
このコードを試してください:
import serial
ports = serial.tools.list_ports.comports(include_links=False)
for port in ports :
print(port.device)
まず、シリアルポート通信用のパッケージをインポートする必要があります。
import serial
次に、現在使用可能なすべてのシリアルポートのリストを作成します。
ports = serial.tools.list_ports.comports(include_links=False)
そして、リスト全体を歩いて、たとえばポート名を印刷できます:
for port in ports :
print(port.device)
これは、ポートのリストを取得してその名前を出力する方法の例にすぎませんが、このデータを使用して他のオプションを実行できます。後で別のバリエーションを印刷してみてください
港。