web-dev-qa-db-ja.com

Python(仮想ポートを含む)でシリアルポートを列挙するクロスプラットフォームの方法は何ですか?

注:私はPython 2.7、およびシリアル通信にpySerialを使用しています。

私は2つの方法をリストしているこの記事を見つけました: http://www.zaber.com/wiki/Software/Python#Displaying_a_list_of_available_serial_ports

この方法はWindowsとLinuxで機能しますが、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)

これはLinuxでのみ機能しますが、仮想ポートが含まれています。

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

Linuxで実行している場合は2番目の方法(仮想ポートを含む方法)を使用し、Windowsを実行している場合は最初の方法を使用してプラットフォーム検出を実行できると思いますが、Macはどうですか?

プラットフォームに関係なく、シリアルポート(仮想も)をどのように列挙する必要がありますか?

編集

私はいくつかの適切な質問を見つけました:

31
Chris Laplante

これは私が使ってきたものです。これは、上記で投稿したメソッドのマッシュアップです。しかし、私はまだより良い解決策を見たいと思っています。

# 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*')
8
Chris Laplante

bitpim 複数のプラットフォームでcomscan用のかなりのコードがありました。おそらく、クロスプラットフォームのシリアルポート列挙子を構築するためにそこからいくつかのコードを取得するのに役立ちます。コマンドラインで直接検出コードを実行してテストできます。

ソースファイルcomscan.pyへのリンク

Linuxでは、「/ dev/ttyS」ポートを検出しなかったようです。行#378の下に次の行を追加すると機能しました。

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

著者は、シリアルポートにさまざまな種類の識別子を簡単に追加できるようにしました。

Macでは、問題なく動作しました。 (Arduinoをテストするのに便利でした)

Windowsでは、接続されたポート(接続されたFTDIコネクタ用)を正常に検出しました。 pywin32 が必要です。

pyserial を使用して、次のことを試しました。

python -m serial.tools.list_ports

Windowsでは動作しないようです。 Macで動作します。 Linuxで動作します。

このコマンドのドキュメント :のプラットフォームセクションを見るのは興味深いことです。

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

この2つを組み合わせると、(ほぼ)100%信頼できるCOMポート列挙子が得られるはずです。

編集:上記のすべてをPython 2.7で試しました。

7
Nandeep Mali

Pyserial関数 serial.tools.list_ports は、あなたが望むものを提供しますか?

3
Gerrat

あなたがまだこれに対する答えを探しているかどうかはわかりませんが、私は実用的な解決策を持っているので、私はそれを投稿すると思いました。これが getportsパッケージ 私のArduinoデータロガープロジェクトの一部です。 Mac、少なくとも一部のLinux、およびWindows 7で動作することをテストしました。bitpimのcomscanとは異なり、標準ライブラリ以外のモジュールは使用しません。また、LinuxまたはMacでは/devグロブを使用しないため、ルールの名前変更は問題になりません。 (Linuxではsysfsを使用し、MacではIOKitを使用します。)Linuxで仮想シリアルポートを検出するかどうかはわかりませんが、検出しない場合は、置き換えてみてください

sys_suffix = '/device/'

sys_suffix = ''

linuxgetports.py

0
Abe Karplus