2017-05-16 17 views
3

USBシリアルデバイスが組み込みシステムに接続されているかどうかを検出し、それに関連付けられているものが何であるかを知る必要があります。C++ USBシリアルデバイスの検出プラグの接続/取り外し

私のシステムは、2.6 Linuxカーネルで動作します。

私はudevのルールへの書き込みアクセス権がないので、今日はファイルシステムからこの情報を取得しようとしており、/sys/bus/usb/devicesディレクトリの変更を探しています。しかし、私はこのアプローチのいくつかの問題に直面しています。

私は、接続されたUSBポートのId BUS(たとえば、1〜1.3)が何であるか知っています。そこで、関連するtty/sys/bus/usb/devices/<Id BUS>:1.0/tty/のディレクトリを探しています - たとえば/sys/bus/usb/devices/1-1.3:1.0/tty/ttyACM0)を検索します。私のデバイスと通信するには、/dev/ttyACM0を使うべきだと私は知っています。 ただし、このデバイス(/dev/ttyACM0)が存在しないことがあります。

この情報を取得する方法はありますか?

私はこの情報をsyslogから取得しようと考えていましたが、これはかなり良いアイデアかどうかわかりません。

編集:

だけ明確にする、私のシステムは、USBバスの状態変化を検出できるようにする必要があり、すなわち、新たなデバイスが接続されているときを検出(およびそれにリンクされているtty名を取得)、または既存の1つは取り外されています。

システムは、USBハブを使用して接続されているUSB /シリアルデバイスを最大でNまで監視しています。通常の実行中に新しいデバイスを接続したり、既存のデバイスを削除したり(この範囲外のリモートコマンドで再起動したりすることができます)。デバイスがリブートされると、カーネルが現時点で無料のttyを指定しているため、前回使用したデバイスとは異なるtty(たとえばttyACM0 - >ttyACM3)を受信する可能性があり、大きな問題です。

答えて

0

libusbpというUSB抽象ライブラリを作成しました。 port_name exampleを見ると、libusbpを使用してUSBシリアルデバイスのシリアルポート名(例:/dev/ttyACM0)を取得する方法が示されています。その背後で、libusbpはlibudevを使ってこの情報を取得します。

+0

ありがとう@ david-grayson、私は質問を編集し、問題のあるシナリオの概要を追加しました。 libを使用して、記述された要件を満たすことは可能ですか? – Valmir

+0

はい、うまくいくはずです。 –

+0

組み込みシステムは残念ながらlibudevを持っていませんが、mdevだけが存在するので、あなたのlibを使うことはできません。 – Valmir

0

statを使用して仮想ファイルが削除されていないか確認してください。

#include <sys/statvfs.h> 

... 

struct stat sb; 
return (stat("/dev/ttyUSB0", &sb) == 0); // true if open, false otherwise 
関連する問題