31

注: 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 を実行している場合は 1 番目の方法を使用してプラットフォーム検出を行うことができると思いますが、Mac の場合はどうでしょうか?

プラットフォームに関係なく、シリアルポート (仮想も) を列挙するにはどうすればよいですか?

編集

関連する質問がいくつか見つかりました。

4

4 に答える 4

8

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

# 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*')
于 2012-07-09T15:39:24.463 に答える
7

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 で上記のすべてを試しました。

于 2012-09-21T10:23:15.360 に答える
4

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

于 2012-07-03T20:16:43.823 に答える
0

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

sys_suffix = '/device/'

sys_suffix = ''

linuxgetports.py

于 2013-02-19T19:53:57.387 に答える