Linux PCで特定のシリアルポートが接続/切断されていることを照会することは可能ですか? 特定のポートが接続されているかどうかを照会するためにsysfs情報を読み取る方法はありますか?
1 に答える
それはむしろ、「接続」の意味に依存します。最初に、最も正確ではありませんが、最も単純な意味について説明します。
ポートの存在
ポート自体がシステムに存在するかどうかを確認する場合は、それをサポートするロード済みモジュールの存在を確認し、/dev/ttyS0 や /dev/ttyUSB0 などのデバイスの存在を確認します。 、それを開くことができることを確認します(たとえば、実際にはそのハードウェアを持たないシステムに /dev/ttyS0 デバイスファイルが存在します)。USB コンバーターはホットプラグ対応なので、現在、稼働中のシステムで実際の「シリアル ポート」が出入りするのを見ることができます。
「モデム」制御/ステータス信号
もう 1 つの可能性は、ポートにケーブル接続されているものがあるかどうかを確認することです。これは、システムが必ずしも認識できるものではありません。周辺機器がアサートでき、ユーザーが読み取ることができるモデム制御信号とステータス信号があります。ただし、周辺機器はそれらを使用する必要はありません。また、モデムの時代にかつては意味があった方法で使用する必要さえありません。接続されている多くのシステムは、受信および送信データ ラインとグランドのみを利用しています。
データを受信して検出
残りの可能性は、ポートからデータを探す以外に、ポートが接続されているかどうかを判断する方法がないことです。一部の周辺機器は一定の間隔で自動的にデータを生成する場合があるため、読み取りを試みて、取得できるかどうかを確認できます。他の場合は、クエリを送信して (望ましくない副作用を伴うものではないことを願っています)、期待される応答が返されるかどうかを確認できます。たとえば、SCPI 標準をほぼ実装している計測器は、"*IDN?\n" という文字列を送信した場合、何らかの識別情報で応答する可能性があります。
これに対するもう 1 つの大きな問題は、ポートと周辺機器を互換性のあるボー レートとワード フォーマットで構成する必要があることです。そうでない場合、一見ランダムなデータが得られる可能性があります。場合によっては、実装している UART エンジンからフレーミング エラー ビットを読み取ることができ (ドライバーがこれを公開しているかどうかを確認する必要があります)、おそらくそこに何かがあることを示すものとしてそれを使用できますが、ボーは間違っています。レート。
ハードウェアをきめ細かく制御し、相手側から期待されるデータを使用して、自動ボーレート検出ルーチンを作成することもできますが、通常は「ホスト」ではなく「ペリフェラル」側で実装されます。