注:私は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はどうですか?
プラットフォームに関係なく、シリアルポート(仮想も)をどのように列挙する必要がありますか?
編集
私はいくつかの適切な質問を見つけました:
これは私が使ってきたものです。これは、上記で投稿したメソッドのマッシュアップです。しかし、私はまだより良い解決策を見たいと思っています。
# 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*')
bitpim 複数のプラットフォームでcomscan用のかなりのコードがありました。おそらく、クロスプラットフォームのシリアルポート列挙子を構築するためにそこからいくつかのコードを取得するのに役立ちます。コマンドラインで直接検出コードを実行してテストできます。
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で試しました。
Pyserial関数 serial.tools.list_ports は、あなたが望むものを提供しますか?
あなたがまだこれに対する答えを探しているかどうかはわかりませんが、私は実用的な解決策を持っているので、私はそれを投稿すると思いました。これが getportsパッケージ 私のArduinoデータロガープロジェクトの一部です。 Mac、少なくとも一部のLinux、およびWindows 7で動作することをテストしました。bitpimのcomscanとは異なり、標準ライブラリ以外のモジュールは使用しません。また、LinuxまたはMacでは/dev
グロブを使用しないため、ルールの名前変更は問題になりません。 (Linuxではsysfsを使用し、MacではIOKitを使用します。)Linuxで仮想シリアルポートを検出するかどうかはわかりませんが、検出しない場合は、置き換えてみてください
sys_suffix = '/device/'
と
sys_suffix = ''
linuxgetports.py
で