106

PC で利用可能なすべての COM ポートを一覧表示する簡単な方法を探しています。

この方法を見つけましたが、これは Windows 固有のものです: Windows でシリアル (COM) ポートを一覧表示していますか?

Windows 7 PCでpySerialでPython 3を使用しています。

pySerial API ( http://pyserial.sourceforge.net/pyserial_api.html ) で、serial.tools.list_ports.comports()com ポートを一覧表示する関数を見つけました (まさに私が欲しいもの)。

import serial.tools.list_ports
print(list(serial.tools.list_ports.comports()))

しかし、うまくいかないようです。USB to COM ゲートウェイが PC に接続されている場合 (デバイス マネージャーに COM5 が表示されます)、この COM ポートは によって返されるリストに含まれていませんlist_ports.comports()。代わりに、モデムに接続されているように見える COM4 しか取得しません (デバイス マネージャーの COM&LPT セクションには表示されません)。

なぜうまくいかないのか知っていますか?システム固有ではない別の解決策がありますか?

4

13 に答える 13

167

これは私が使用するコードです。

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 __name__ == '__main__':
    print(serial_ports())
于 2013-01-08T21:38:10.027 に答える
11

トーマスの優れた答えに対する可能な改良は、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 でのみテストされています。

于 2014-07-13T06:21:25.470 に答える
3

このコードを試してください:

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)

これは、ポートのリストを取得してそれらの名前を出力する方法の単なる例ですが、このデータを使用して実行できるオプションが他にもいくつかあります。後で別のバリアントを印刷してみてください

ポート。

于 2018-09-24T20:27:27.683 に答える
0

いくつかのオプションが利用可能です:

NULL lpDeviceName を指定してQueryDosDeviceを呼び出し、すべての DOS デバイスを一覧表示します。次に、各デバイス名で CreateFile とGetCommConfigを順番に使用して、それがシリアル ポートかどうかを調べます。

GUID_DEVINTERFACE_COMPORTのClassGuidで SetupDiGetClassDevs を呼び出します。

WMI は、C/C++ プログラムでも使用できます

win32 ニュースグループと CodeProject、えー、プロジェクトで会話があります。

于 2012-08-23T11:29:38.760 に答える