2013-03-11 9 views
5

linuxのシリアルポートに接続されているすべての接続デバイスを検出する良い方法はありますか?私はC++でプログラミングしていますが、他の例も歓迎しています。C++ linuxはすべてのシリアルポートを検出します

すべてのポートを開こうとするだけで、ポートのリストに追加することができますが、これは本当に良い解決策ではないようです。

devディレクターに入ることができます。シリアルポートがUSBポートであるため、どのttyUSB ..ファイルが作成されたかを確認できます。しかし、tty0からtty63までのファイルは常にこのディレクトリにあるので、これはUSB以外のシリアルポートでは機能しません。

私の例:

std::string port; 
int fd 
std::vector<std::string>> list; 
for(int i = 0; i < 256; ++i) 
{ 
    port.clear(); 
    port.append("/dev/ttyUSB"); 
    port.append(std::to_string(i)); 
    fd = open(port.c_str(), O_RDWR | O_NOCTTY | O_DELAY); 
    if(fd != -1) 
    { 
     list.push_back(port); 
    } 
} 

ありがとう!

+0

シリアルポートの名前は通常「ttyS0」と続きます。 – Hasturkun

+1

これは私にあなたの実際の問題がXであるXY質問の感触を与え、解決策はYだと思うので、Yを尋ねます。なぜシステムのシリアルポートについて知りたいのですか? –

+0

ポートの1つにジグビーデバイスが接続されています。ユーザーフレンドリーにしたいので、ユーザーが選択できるようにすべての可能性をリストしたいと思います。通常、あなたのZigbeeデバイスを接続する場合は、ちょうど1つのポート番号が返されます。 @Hasturkun私の場合、私のシリアルデバイスはUSB接続を使用しているので、それはttyUSB0という名前です。 – Silver

答えて

7

Linuxのデバイスを列挙する標準的な方法は、/sysファイルシステムを参照することです。この場合は、次のようにすることができます:/sys/class/tty/foo/devicelstat()を使用して存在している場合

  1. 各ディレクトリ/sys/class/tty/fooに対して/sys/class/tty
  2. 内のすべてのファイルを列挙し、確認してください。
    • 存在しなければ、仮想ttyデバイス(仮想コンソールポート、ptmxなど)を処理していて、それを破棄することができます。
    • 存在する場合は、シリアルポートfooを保持してください。

あなたは、実際のシリアルポートのリストにしておく必要があります。

+0

私はこのメカニズムで32個のデバイスを手に入れました。 2が有効です。実際にはドライバである 'serial8250'を指していないことを確認する必要があります – Petesh

+0

私のシステムのいくつかでは、' device'シンボリックリンクが 'serial8250'を指している実際の有効なシリアルポートを持っています...私はそうではありませんなぜあなたは無効なものがたくさんあるのですか? – Celada

+0

32はカーネルの設定値 'CONFIG_SERIAL_8250_RUNTIME_UARTS'から来ていますが、これはデフォルトの' 32'(これはx64 3.2カーネルです)以上のものをサポートすると思います。 – Petesh

関連する問題