質問: usb機器からのデータ受信による割り込み処理について お世話になります、fujitomoです。 まだ実際にプログラムのコードを開発しているわけではないので、漠然としたイメージでの質問となるのですが、質問させて頂く内容は usb機器で取得した測定データを、usb機器からアプリケーション(c++ mfcにて開発)に送信し、受信時に割り込み受信の処理をし、そのusb機器から送信されたデータをリストやダイアログ上に表示させたいと思ってるのですが、その実際の実装方法の流れを教えていただければと思い、質問いたしました。 シリアル通信と同様にusb用の割り込み受信関数といったようなものがあるのでしょうか? 全体の流れのイメージが掴めず、どこから着手していいか分からないため、ご存知の方がいらっしゃいましたら、ご回答宜しくお願い致します。
回答: windowsと仮定しますが、windowsではアプリケーションが直接usb機器にアクセスする事は出来ません。 usb(と言うか、正確には「windowsのカーネルシステムが認識しているusbポート」ですが)は、windowsのカーネルシステムが占有しています。 特定のアプリが特定のusb機器を制御するには「その機器専用のデバイスドライバ」を介して行う事になります。 「windowsのカーネルシステムが認識しているusbポート」に「usb機器」が接続されると、windowsのカーネルシステムは「お前は誰だ?」と、機器に問い合わせを行います(inquiryコマンドの発行と機器問い合わせ) そして、問い合わせた結果「お前を制御するデバイスドライバがインストールされてない」と判ると、デバイスドライバのインストールを要求して来ます。 なお、デバイスドライバがインストール済みであれば、認識後の初期化処理をデバイスドライバに行わせ、それ以降の機器アクセスはデバイスドライバに一任します。 で、無事にデバイスドライバがインストールされ、機器の初期化と認識が終わると、デバイスドライバは、アプリケーションで使用可能な「アプリ用のソフトウェア的なインターフェース」を提供します。 つまり「アプリがデバイスドライバを利用可能になる」わけです。 「アプリ用のソフトウェア的なインターフェース」が「その機器専用の物」なのであれば「デバイスドライバを作った人が勝手に決めて良い」ので、アプリからして見れば「デバイスドライバの仕様書の通りに、決められた通りにインターフェースを行う」しかありません。 「アプリ用のソフトウェア的なインターフェース」が「usbメモリのような、標準的な外部記憶装置としてのインターフェース」であれば、アプリケーションは「普通のファイルにアクセスするように、そのドライブ装置にアクセスするしかない」ので、悩む余地はありません。 そういう訳で、アプリを書くのは、そんなに大変ではありません。 問題なのは「その機器専用のデバイスドライバ」です。 biosを介して、または、windowsのカーネルルーチンの呼び出しを駆使して、機器をコントロールしなければなりません。送信タイムアウトとか、受信タイムアウトとか、データのバッファリングとか、コマンドの強制中断とか、ユーザーによる機器の取り外し要求に対するデバドラの終了処理とか、機器に対するリセット指示とか、機器が応答しない処理とか、あらゆる場合についての機器の制御が要求されます。 それと同時に、アプリ側とのインターフェースも行わないとなりません。機器の機能を過不足なくユーザーに提供する為の、考えられる限りのインターフェースをアプリに提供しなければなりません。「この機器の、この機能は、パソコンと接続した場合は、デバイスドライバで未サポートなので使えません」じゃ困りますからね。 また「その機器が繋がっているusbポートには、usbハブを介して、別のusb機器が繋がっている」ので、例え割り込みで「受信したぞ~」って言われても、勝手にusbポートにアクセスしに行ってはいけません。その割り込みは「他の機器が発した、他のデバイスドライバに対する割り込みで、自分宛じゃない」のかも知れませんから。 そんな訳で「もし、デバイスドライバの開発をする部署なのであれば、即死できる」と思います。デバドラの開発は「簡単に死ねるほど複雑」ですから。 とは言え「コード書いた人間に、デバドラのコードを書かせたりはしない筈」なので、ま「1年半は勉強のつもりで下積み」をやらされるでしょう。 大変でしょうが、がんばってくださいね。