5

この問題の解決策はおそらく非常に単純ですが、私は動的にデバイスとやり取りするのは初めてです。私がやっていることは、Python 実行可能コードを作成しているため、ユーザーは自分のコンピューターやあらゆる種類の Python インタープリターで Idle を使用する必要がありません。つまり、デバイスがどの USB ポートに接続されるかわかりません。に。プログラムは、シリアルから USB へのコンバーターを介して接続されているデバイスへの接続を開くことができる必要があります。どの接続デバイスがポートを開くのに適したデバイスであるかを判断するにはどうすればよいですか? デバイスとやり取りするためにpySerialを使用しています。どんな助けでも大歓迎です。

4

3 に答える 3

7

デバイスをどのように構成しても、おそらくどこかの時点で、ユーザーにポートの場所を尋ねたり、すべてのシリアル デバイスをポーリングして既知の応答を求めたりする必要があります。(ただし、ポーリングには落とし穴がありますので、読み進めてください!)。USB デバイスとは異なり、プレーン オールド シリアル デバイスを接続したときに OS に認識されるベンダー/デバイス ID はありません。

まず、シリアル ポートを見つける必要があります。ここに役立つかもしれない質問があります: Python でシリアルポート (仮想ポートを含む) を列挙するクロスプラットフォームの方法は何ですか? .

シリアル ポートのリストを取得したら、どのポートを使用するかをユーザーに尋ねることができます。もしそうなら、問題は解決しました!

そうでない場合は、デバイスから特定の応答が得られることがわかっているデータを使用して、すべてのシリアル デバイスをポーリングすることを提案できます。ただし、ユーザーが他のシリアル デバイスを接続している場合、"hello" バイトの文字列は、実際には他のデバイスの自己破壊シーケンスである可能性があることに注意してください。したがって、ポーリングが他のデバイスに干渉する可能性があることをユーザーに警告し、そうする前に常にプロンプ​​トを表示する必要があります。

コードについて詳しく知らなければ (たとえば、使用している通信フレームワークがある場合は、コンソールでこれを行っているのか、GUI ツールキットを使用しているのかなど)、これをコーディングするための最良の方法を言うことは不可能です。かもしれません。最も単純なケースでは、すべてのシリアル デバイスをループして、グリーティングを送信し、応答を確認することができます。(これを並行して行うこともできます。挨拶のために 1 回ループし、バッファの内容を確認するためにもう一度ループします。それよりも凝ったものにする場合は、適切なライブラリを使用してください。)


補足:ベンダー/デバイス ID を設定できる組み込みのコンバーターがある場合、これを回避できる可能性がありますが、コンバーターは最新の OS によって自動的に検出され、シリアル ポートとして列挙されます。USB デバイスとして直接通信することはできません。どのポートがどの ID に対応しているかを把握することは可能かもしれませんが、私はそれを試みたことはありません。しかし、コンバーターを選択するのがあなたでない場合 (たとえば、ユーザー提供のケーブルの場合)、このアプローチは役に立ちません。

于 2012-08-01T01:27:44.017 に答える
3

これは、私が Arduino のようなシリアル USB 変換デバイスを識別するために使用した方法です。デバイス記述の「USB」文字列をチェックします。

import serial as ser
import serial.tools.list_ports as prtlst

global COMs
COMs=[]
def getCOMs():
    global COMs
    pts= prtlst.comports()

    for pt in pts:
        if 'USB' in pt[1]: #check 'USB' string in device description
            COMs.append(pt[0])
于 2016-12-17T15:51:01.737 に答える