web-dev-qa-db-ja.com

CまたはC ++でUSBデバイスからデータを受信する

接続されているすべてのUSBデバイスのリストが必要です。ユーザーにリストを選択してもらい、コンソールアプリケーションがUSBデバイスから送信されたデータを受信できるようにします。

その後、プログラム内のデータをいじり始めることができます。

ライブラリは使用せず、標準のC++関数のみを使用します。プログラムは、Windows98で動作するはずです。

12
Midas

これは非常にフォーラムやプログラミングQ + Aサイトでの永続的な質問です。ハッピーエンドでは決してありません。 USBのBはバスを意味します。これは、電子デバイスがデータを交換するための電気的インターフェースを説明するためのコンピューターハードウェア設計の用語です。これは、たとえば、マシン内のPCI(エクスプレス)バスとまったく同じ役割を果たします。 USBは何よりも電気的な仕様であるため、非常に多くの種類のデバイスをサポートします。ワイヤレスネットワークアダプタ、モデム、フラッシュメモリカードからティーポットウォーマーまで何でも。うまく処理できないデバイスの種類は、ビデオアダプタのように非常に広い帯域幅を必要とするデバイスだけです。

USB仕様には、デバイスがバスを共有する方法とデータを交換する方法を説明する非常に洗練されたプロトコル仕様があります。ただし、そのプロトコル仕様はデータの形式をまったく説明しておらず、バイトのチャンクを配信できるという概念を定義しているだけです。これらのバイトに意味を与えるのはデバイス自体の責任です。

マシン側では、これらのバイトを解釈し、マシンにそれらを使って何か面白いことをさせるためのソフトウェアが必要です。それにはデバイスドライバーが必要です。ビデオカードやネットワークインターフェイスカードと同じように、デバイスドライバが必要です。明らかに、ビデオドライバは非常に NICドライバとは異なります。同じことがUSBドライバにも当てはまり、共通点はほとんどありません。

USBデバイスを同様に扱うソフトウェアを作成したい場合は、それらにまだ共通点があるレベルで作成する必要があります。これはUSBコントローラーレベルで、USBドライバースタックにそれ自体を挿入し、コントローラーとデバイスドライバー間のI/O要求パケットをピークするフィルタードライバーを作成できます。たとえば、TCP/IPトラフィックをスパイするwinpcapフィルタードライバーに似ています。ただし、興味深いものはほとんどありません。前後に渡されるバイトのブロブを見つめていることになります。これはwinpcapよりもはるかに大きな問題であり、少なくとも、RFCのどこかにその意味が文書化されているバイトが飛んでいるのがわかります。 USBの場合はそうではなく、USBデバイスを製造する会社は、通常、デバイスドライバーのサプライヤーでもあります。それらは内部フォーマットを文書化せずに保ちます。

フィルタドライバを作成するには、かなり高度なスキルが必要です。多くの問題点があります。単純な間違いをしたときにオペレーティングシステムをクラッシュさせるようなものです。最近、Windows Driver Modelにもかなりの変化があり、オペレーティングシステムを安定させるためにUSBドライバーがリング3(ユーザーモード)に移行しています。

開始するには、Windows WDK(別名「DDK」)をダウンロードして、WalterOneyの本を読んでください。できればそれらすべて。

22
Hans Passant

USB用のプログラムを作成し、その背景を理解したいが、それについてあまり読みたくない、ライブラリを使用したくない、すべてを同時に行うにはどうすればよいでしょうか。とにかく。 Stefan Meyerのプロジェクト「libUSBWin32」は現在開発が進んでいませんが、Cで書かれているので、これはあなたにとって何かかもしれません。古いWindowsバージョンで実行する機能もあります;)ここで見つけることができます:
http://sourceforge.net/apps/trac/libusb-win32/wiki
しばらく前に、「libUSB Win32」を利用するVB6でこれを書いたのですが、それがあなたに役立つかどうかわかりません。
http://www.activevb.de/cgi-bin/upload/download.pl?id=3061

3
OlimilOops

これがあなたが始めるための何かです:

そして、最後の千年紀からではないOSへの大声での更新を叫ぶために。 LinuxはUSBを大いにサポートしていると聞きました。

2
Matti Virkkunen

ここで得ているアドバイスは的を射ています。 USBは簡単ではありません、信じてください...私はUSBプロジェクトに取り組んでいますが、バックエンドからです。バックエンドも検討する必要があるように思われます。ここでは、ライブラリなどを実際に処理する必要はありませんが、何をしていても読書を回避することはできません。

まだ落胆しないでください、しかしあなたが飛び込んで溺れる前にあなたはあなたの足を濡らす必要があります。 USB2.0とUSB3.0はかなり乾燥していますが、 OSDev Wikisbmadesimple が有用な足がかりであることがわかりました。

それでもPCを使用する必要がある場合は、USBスニファが見つかった場合に備えてオープンソースのUSBコードを入手することを検討する必要があります。

0
DRD

プラグインされたすべてのUSBデバイスのリストが必要なだけで、ユーザーに1つを選択させて、コンソールアプリケーションがUSBデバイスが送信するデータを受信できるようにします。

リストを取得することは大きな問題ではなく、データを受信することです。

私はあなたがドライバーを書きたくないことを知っています、しかしこれはドライバーがすることです:デバイスからデータを受け取ります。

0
egrunin