
お世話になります、fujitomoです。
まだ実際にプログラムのコードを開発しているわけではないので、漠然としたイメージでの質問となるのですが、質問させて頂く内容は
USB機器で取得した測定データを、USB機器からアプリケーション(C++ MFCにて開発)に送信し、受信時に割り込み受信の処理をし、そのUSB機器から送信されたデータをリストやダイアログ上に表示させたいと思ってるのですが、その実際の実装方法の流れを教えていただければと思い、質問いたしました。
シリアル通信と同様にUSB用の割り込み受信関数といったようなものがあるのでしょうか?
全体の流れのイメージが掴めず、どこから着手していいか分からないため、ご存知の方がいらっしゃいましたら、ご回答宜しくお願い致します。
No.3ベストアンサー
- 回答日時:
Windowsと仮定しますが、Windowsではアプリケーションが直接USB機器にアクセスする事は出来ません。
USB(と言うか、正確には「Windowsのカーネルシステムが認識しているUSBポート」ですが)は、Windowsのカーネルシステムが占有しています。
特定のアプリが特定のUSB機器を制御するには「その機器専用のデバイスドライバ」を介して行う事になります。
「Windowsのカーネルシステムが認識しているUSBポート」に「USB機器」が接続されると、Windowsのカーネルシステムは「お前は誰だ?」と、機器に問い合わせを行います(Inquiryコマンドの発行と機器問い合わせ)
そして、問い合わせた結果「お前を制御するデバイスドライバがインストールされてない」と判ると、デバイスドライバのインストールを要求して来ます。
なお、デバイスドライバがインストール済みであれば、認識後の初期化処理をデバイスドライバに行わせ、それ以降の機器アクセスはデバイスドライバに一任します。
で、無事にデバイスドライバがインストールされ、機器の初期化と認識が終わると、デバイスドライバは、アプリケーションで使用可能な「アプリ用のソフトウェア的なインターフェース」を提供します。
つまり「アプリがデバイスドライバを利用可能になる」わけです。
「アプリ用のソフトウェア的なインターフェース」が「その機器専用の物」なのであれば「デバイスドライバを作った人が勝手に決めて良い」ので、アプリからして見れば「デバイスドライバの仕様書の通りに、決められた通りにインターフェースを行う」しかありません。
「アプリ用のソフトウェア的なインターフェース」が「USBメモリのような、標準的な外部記憶装置としてのインターフェース」であれば、アプリケーションは「普通のファイルにアクセスするように、そのドライブ装置にアクセスするしかない」ので、悩む余地はありません。
そういう訳で、アプリを書くのは、そんなに大変ではありません。
問題なのは「その機器専用のデバイスドライバ」です。
BIOSを介して、または、Windowsのカーネルルーチンの呼び出しを駆使して、機器をコントロールしなければなりません。送信タイムアウトとか、受信タイムアウトとか、データのバッファリングとか、コマンドの強制中断とか、ユーザーによる機器の取り外し要求に対するデバドラの終了処理とか、機器に対するリセット指示とか、機器が応答しない処理とか、あらゆる場合についての機器の制御が要求されます。
それと同時に、アプリ側とのインターフェースも行わないとなりません。機器の機能を過不足なくユーザーに提供する為の、考えられる限りのインターフェースをアプリに提供しなければなりません。「この機器の、この機能は、パソコンと接続した場合は、デバイスドライバで未サポートなので使えません」じゃ困りますからね。
また「その機器が繋がっているUSBポートには、USBハブを介して、別のUSB機器が繋がっている」ので、例え割り込みで「受信したぞ~」って言われても、勝手にUSBポートにアクセスしに行ってはいけません。その割り込みは「他の機器が発した、他のデバイスドライバに対する割り込みで、自分宛じゃない」のかも知れませんから。
そんな訳で「もし、デバイスドライバの開発をする部署なのであれば、即死できる」と思います。デバドラの開発は「簡単に死ねるほど複雑」ですから。
とは言え「コード書いた人間に、デバドラのコードを書かせたりはしない筈」なので、ま「1年半は勉強のつもりで下積み」をやらされるでしょう。
大変でしょうが、がんばってくださいね。
No.6
- 回答日時:
>USB用の割り込み受信関数といったようなものがあるのでしょうか?
USB機器にはデータ受信による割り込みはありませんよ。
「見かけ上でも」という問いに対しては、デバイスドライバ次第、としか答えられません。
割り込み転送というモードがありますが、本当の所はポーリングです。
つまりUSB機器は、「CPUからの問い合わせに対し、応答する」しか通信の方法がありません。
見かけ上、「データ受信による割り込み」を実現するには、
「その機器専用のデバイスドライバ」をつくり、デバイスドライバがたとえば16/1000秒毎にUSB機器に対し、「受信データありますか?」と問い合わせをし、「ある」と答えたとき、アプリケーションに対し割り込みをかける
ことで実現しています。
USBポートには複数のUSB機器がハブなどを通して接続されている可能性があるので、特定のUSB機器への問い合わせは、勝手にできません。デバイスドライバは、1ms(USB2では1/4ms)周期で繰り返し転送されている「フレーム」の予約席を確保し、確保したタイミングにすばやく、問い合わせをする必要があります。No3さんの回答のように、このデバイスドライバの作成は、「簡単に死ねるほど複雑」です。
No.5
- 回答日時:
まず、USBにはいくつか転送モードがあります。
割り込み転送:HIDデバイスのような不定期通信。
バルク転送:データ保証あり。USBストレージに使用。
インタラプト転送:帯域保証のため、データエラーでも再送信はしない、USBカメラなど。
(コントロール転送は、この質疑では除外)
このどれもが、「USB機器から割り込み通信があった」ということをアプリケーションレベルでは通常取得することはできません。
たとえば、USBマウスを接続したとしても、OSからは「USBデバイス」として認識されますが、OS介してアプリから見ると「(USB接続された)マウス」でしかなく、扱いは「マウス」にしかならないからです。
つまり「USBデバイス」(それ以外の接続機器も)直接I/Fが何かということを知る術がないのです(COMポートは「COMポート」というH/WとしてOSがアプリに通知しているので別)。
そのため、割り込みタイミングを直接取得するためには一般的には専用のデバイスドライバ(とDLL[API])を作成し使用(提供)します。
尚、
>シリアル通信と同様にUSB用の割り込み受信関数といったようなものがあるのでしょうか?
「USBデバイス」というくくりからでは「ありません」というのが回答です。
USB-COM変換の場合はエミュレーションを行っているドライバー次第です。(アプリからは「COM」として見えているから)
その他のデバイスもやはり「ドライバー次第」という回答になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- USBメモリー・SDカード・フラッシュメモリー 銀行が振込データの受け渡しに未だにFDを使っている理由は「FDDがAドライブ固定だから」って本当? 11 2022/06/02 03:53
- その他(パソコン・周辺機器) Windowsマシン。USBタップの「自動切れ、再接続」がうざい。解決策は? 7 2023/01/25 08:27
- その他(ビジネス・キャリア) FA機器の無線スイッチ(の受信器)、シュナイダーのZBRRAの仕様について教えて下さい。 仕様では出 2 2022/08/13 21:12
- ガラケー・PHS 携帯電話の居場所信号の発信タイミング 3 2022/07/27 14:39
- その他(パソコン・周辺機器) 品質の良いUSB Type-Cのハブ(型番、もしくはメーカー)を教えてください。 5 2023/07/23 13:44
- ダイヤルアップ Raspberry Piでアナログモデム経由で音声再生 1 2022/05/20 18:01
- Google Drive USB内の圧縮フォルダが開けません。教えて下さい! 1 2022/07/26 18:44
- iPod・ウォークマン・音楽プレーヤー パソコンのHDMI出力をオーデオに使うのは音質上良くないのでしょうか。 4 2022/04/14 19:50
- ネットワーク OSI参照モデルの各層の役割がわかりません。 3 2023/04/21 21:12
- 固定電話・IP電話・FAX PCでFAX受信するソフトのお薦めありますか? 7 2022/06/16 10:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マイコン C言語 割り込み処理...
-
電車で待機列の割り込みについ...
-
一定時間操作がなかったら、と...
-
アセンブラのタイマー割り込み
-
このレジの並び方は間違ってま...
-
【組込み】割り込み中のstatic...
-
VB6でSendKeyを利用したTab移動...
-
AKI-H83048で割り込みを使用し...
-
電車乗車時、並んでいるのに割...
-
Excelでタイマーの一時停止する...
-
実行した後、どうしてもフリー...
-
PICでタイマー割込み(mikroC V...
-
マイコンSH-2の割り込みを用い...
-
割り込みのカウントの仕方
-
C-Builder OnChangeをマスク
-
PICのSleepからの復帰に関して
-
H8/3052F/IRQを使った割り込み
-
MIKROCのButton()関数について
-
割り込み中に例外異常
-
H8マイコンで割り込みが任意の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
電車で待機列の割り込みについ...
-
このレジの並び方は間違ってま...
-
スーパーのレジで並んでいたら...
-
H8マイコンで割り込みが任意の...
-
【組込み】割り込み中のstatic...
-
CPU負荷率の安全な上限と計...
-
CPUの処理量を減らすコーデ...
-
PICマイコンでエンコーダパルス...
-
pic 複数の割り込み関数 切り分...
-
irqbalance って
-
Amazonfireタブレットにわから...
-
USB機器からのデータ受信による...
-
マイコン C言語 割り込み処理...
-
デーモンと無限ループの違いは...
-
アトメル社製ATtiny2313マイコ...
-
アプリケーションをフルスクリ...
-
VB.net 割り込みの禁止
-
H8 3694 受信割込みについてです
-
C-Builder OnChangeをマスク
-
VB6でSendKeyを利用したTab移動...
おすすめ情報