問題タブ [winusb]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
694 参照

usb - Windows 7 に winusb.sys をインストールする際の混乱

USB デバイスの電源管理オプションをオフにする C++ コードを書き込もうとしていますが、同じことを行うための winusb API があることがわかりました。wdk をダウンロードし、同じものに必要なファイルを取得しました。私は行ってsystem32フォルダーを見たところ、ファイルwinusb.sysが既に存在していることがわかりました(Windows 7の場合)。リンクに従って、infファイルを使用してパッケージを作成してドライバーを再インストールする手順に従う必要がありますか?.

winusb 関数を初期化し、デバイスのハンドルを取得するために、API と API は winusb.sys の GUID を必要とします。

0 投票する
1 に答える
743 参照

visual-studio-2013 - winusb デバイス ドライバ アプリケーションが実行されていない

一般的な USB デバイスを使用して割り込みエンドポイントを介して基本的な読み取りを行う WinUSB アプリケーションを開発しています。デバイスドライバーは正常にインストールされました。ただし、デバイスが接続されたときに、アプリケーションの t_main 関数はまったくトリガーされません。Visual Studio デバッガーでのみトリガーされ、正常に動作します。

ここで何が欠けていますか?Winusbtrace はデバイスを検出し、WinUSB_InitControlPipe と WinUSB_DOEntry のエントリと終了をログに記録します。Windows/inf/*.log のログはインストールのみを記録するため、役に立ちません。参照できる他のログはありますか?

ご意見をお寄せいただければ幸いです。前もって感謝します。以下は私のINFファイルで、Win 7 x64でVisual Studio 2013を使用しています

0 投票する
0 に答える
473 参照

.net - DoWork と RunWorkerCompleted の間の 5 秒の遅延

DoWork() で WinUSB ReadPipe() 呼び出しを保留する BackGroundWorker があります。ReadPipe() がデータを返すと、そのデータは DoWorkEventArgs パラメータにパッケージ化され、DoWork() は終了します。

通常、RunWorkerCompleted() は、DoWork() が終了した直後に実行されます。ただし、時々、2 つの間に 5 秒の遅延があります。DoWork() と RunWorkerCompleted() の開始時と終了時に DateTime.Now タイムスタンプを使用して、遅延が発生した場所を正確に特定しました。

DoWork() と RunWorkerCompleted() の間の遅延の原因は何ですか? 私に何かできることはありますか?

0 投票する
0 に答える
1357 参照

windows - WinUSB を使用して任意の USB デバイスと通信できますか?

特定のデバイスで WinUSB を使用できるかどうかを判断する方法はありますか?

USB3 Vision デバイスで libusb を使用できるかどうかを確認しようとしています。USBデバイスとの通信を試みたのはこれが初めてなので、いくつかの問題があります。

libusb のサイトから、デバイスのドライバーとして WinUSB を使用する必要があることがわかりました。また、WinUSB は多くのデバイスにとって安全な賭けのようですが、WinUSB を USB3 Vision デバイスで使用できるかどうかを判断するのに苦労しています。

オンラインで直接の「はい」または「いいえ」を見つけることができなかったので、Zadigを使用して WinUSB をインストールしようとしましたが、うまくいきませんでした。また、カスタム inf ファイルを作成し、デバイス マネージャーから WinUSB ドライバーをインストールしようとしました。明らかに、私はあまり運がありませんでした。

USB3 Vision は比較的新しいことを知っているので、同様のことを試みた人はあまりいないかもしれません。そのため、WinUSB をデバイスのドライバーとしてインストールし続ける価値があるかどうか疑問に思っています。自分のデバイスで動作するかどうかを確実に知る方法はありますか?


アップデート:

デバイスの [詳細] セクションに互換性のある ID がないようです ([デバイス マネージャー] -> [デバイス] を右クリック-> [プロパティ] -> [詳細] )。WinUSB 互換 ID がないということは、互換性がないことを意味する可能性はありますか?

0 投票する
1 に答える
1521 参照

c++ - USBポート用Windowsフォームアプリケーション

以前は、RS232 接続を確立するために Windows フォーム アプリケーションを使用していました。既に提供されているシリアルポート部品(SerialPort)を使用し、比較的簡単にRS232通信を確立することができました。

さて、USB 通信を確立するために Winodows Form アプリケーションに似たようなものがあるのではないかと思っていました。

デバイスとの非常に低レベルのインターフェースを提供するこの WinUSB API があるようです。しかし、それがどれほど簡単かはわかりませんか?また、Windows フォーム アプリケーションに統合するのがどれほど簡単かわかりませんか?!

そのような USB インターフェイス API のより単純なバージョンはありますか?

Visual Studio に固執する必要はありません。WinUSB以外に、人々が使用するより標準的なc++ USB APIはありますか? USB 経由で何らかの通信を行う GUI API を開発したいと考えています。必要に応じて、プロセスを容易にするのであれば、Python やその他のツールを使用できますか?

前もって感謝します。

0 投票する
1 に答える
1556 参照

windows-7 - ST-LINK V2 USB ドライバー WinUSB アクセスが拒否されました

ST-LINK/V2 ドングルを使用して組み込みプロジェクトを開発/デバッグするように構成された Win7/64 開発マシンを (連絡できない他の誰かが) 持っています。PC はドングルを検出してインストールしますが、どのアプリケーションもドングルにアクセスできず、'No ST-Link device detected'タイプ エラーが発生します。

これが非常にイライラするのは、同じドライバー、ソフトウェア、およびドングルを使用して問題なく動作する別の Win7/64 マシンがあり、マシン間で開発環境を転送できなかったことです。

STATUS_ACCESS_DENIEDWinUSB が各ドングル アクセス要求に対してIRP ステータスを返すことを (USBlyzer を使用して) 発見しました。誰かが以前にこのようなものを見たことがあることを願っています。

PS "STMicroelectronics STLink ドングル ドライバー" の日付は 2010 年 7 月 28 日です。

0 投票する
0 に答える
3361 参照

c++ - 一括エンドポイントからできるだけ速くデータを読み取る WinUSB ベースのドライバーを作成する方法

マイクロコントローラーが USB 経由で PC と通信できるようにするコードを作成しようとしています。コードの大部分は適切に配置されていると思います。通信は通常、低速 (メッセージあたり > ~5ms) である限り正常に機能します。ただし、はるかに高速 (できれば、各メッセージ間で数十から数百マイクロ秒の速度) で 0% のドロップ率で動作させたいと考えています。通信はフルスピードの USB 2.0 プロトコルを使用するように構成されているため、転送速度は約 12 MHz です。

プロトコルがどのように機能するかという理由で、(たとえば) CAN に比べて USB の問題をデバッグするのは難しいと思いますが、問題はデバイスとのインターフェイス用に書いた PC 側のドライバーにあると思います。

デバイスとドライバーは、2 つの標準コントロール エンドポイント (物理エンドポイント 0 と 1) を使用し、さらに 2 つのバルク エンドポイントを使用します。

  • BULK 2 Out (物理エンドポイント 4)
  • BULK 2 In (物理的エンドポイント 5)

これらの両方の最大パケット サイズは 64 バイトです。

私が作成したドライバーは、Microsoft のサイトのサンプル コードに多かれ少なかれ基づいていました。私は関数をエクスポートしましたがreceiveMessage、元々、これが呼び出されるたびに 64 バイトのバッファーが割り当てられ、 を使用して BULK 2 In パイプから 64 バイトのデータが要求されましたWinUsb_ReadPipe。読み取るデータがない場合にアプリケーションがハングしないように、1 ミリ秒のタイムアウトがあります。

これは基本的に、パイプからデータが読み取られる速度が、アプリケーションがポーリングできる速度に制限されることを意味します。アプリケーションがパイプからデータを読み取るよりも、デバイスがパイプにデータを書き込む速度の方が速い場合、問題が発生することは間違いありません。この問題を解決するために、ドライバー内にキューとスレッドを作成して、パイプを継続的にポーリングし、受信したメッセージをキューに格納するだけで、アプリケーションは「receiveMessage」を使用して余暇にメッセージを読み取ることができます。しかし、これはあまりうまくいきませんでした。

私が望むのは、次のことを確実にする方法を示すコード サンプルです。

  • データは、BULK In パイプからできるだけ速く読み取ることができます。
  • メッセージを「バッファリング」する方法があるため、デバイスは、アプリケーションが短時間処理できるよりも速くパイプに書き込むことができますが、メッセージはドロップされません。

考えられるアプローチの 1 つは、デバイスとドライバーの間に別のバルク パイプラインをセットアップすることだと思います。次に、デバイスはすべての送信メッセージをバッファーに格納し、このバッファー内の対応するインデックスに各メッセージのバイト数を含む別の配列を保持する必要があります。次に、アプリケーションが一連のメッセージを読み取る必要があるときはいつでも、ドライバーはこれらのパイプラインのいずれかを使用して、デバイスからメッセージ バイト配列を要求します。この配列の値ごとに、ドライバーは を使用してそのバイト数の要求を発行しますWinUsb_ReadPipe。デバイスは、USB バスを介して各メッセージを同じ順序で送信することによってサービスを提供します。ただし、これが機能するかどうか、または過度に複雑かどうかはわかりません。

私の現在の初期化コード:

次のコードを使用して、ドライバー内のメッセージを内部的にポーリングします。

receiveMessageドライバーを使用するアプリケーションがメッセージを受信するために使用できる、エクスポートされたコードを次に示します。

編集

Hasturkun の提案に基づいて、コードに次の変更を加えました。

初期化内:

パイプ スレッドの読み取り:

messagePollerまた、すべてを処理するようになったので、に関係するすべてをコメントアウトしましたreadPipe

ただし、まだパフォーマンスの問題が発生しています。

編集2

readPipe上記のコードを更新しました。

問題は自分のドライバーなのか、それともマイクロコントローラーなのか、真剣に考え始めています。CAN のようなプロトコルを使用すると、問題がどこにあるかを簡単に特定できます...

ドライバーに、受信したすべてのメッセージのログを生成させました。これには、スレッドが 2 つのメッセージを受信する間の時間差や、どのスレッドがメッセージを処理しているか (私は 2 つ持っています) などの追加の詳細が含まれます。次のような出力が得られます。

基本的に何が起こっているかというと、アプリケーションが最初に起動されたときに、アプリケーションとデバイスの間で多数の「起動」メッセージが送信されます。約 4 秒後、アプリケーションを使用して、50 ミリ秒間隔で送信される 4 つのメッセージのグループで構成されるデバイスからの安定したメッセージ ストリームを要求します。

  1. 0000000D...
  2. 0000010D...
  3. 0000020D...
  4. 0000030D...

予想されるポイントで数百マイクロ秒単位で一貫して値を報告していることがわかるため、ドライバーは実際に非常にうまく機能しているように見えます。でも:

  • 30D... メッセージは 20D... メッセージの前に一貫して到着しているようです。
  • 10D... メッセージが一貫してドロップされる

これは、マイクロコントローラ コードの問題である可能性があります。私はダブルバッファリングされたエンドポイントを使用しているので、メッセージが順不同で到着する理由が理解できます。

1 つのことは、後続のメッセージを送信する前に、マイクロコントローラー コードのバルク IN パイプで ACK を明示的に待機していないことです。それが問題かもしれませんが、以前に試してみましたが、あまり効果がないようでした.

以下は、USBLyzer 出力のスクリーンショットです (別の実行中に取得したため、データは完全に同一ではありませんが、非常に似ています)。ログ ファイルの形式が適切でないため、スクリーンショットになっています。

直接リンク

直接リンク

編集3

私のマイクロコントローラーは、各メッセージ間で約 30 マイクロ秒 (最大レート) でメッセージをドライバーに送信しているようですが、ログに基づくと、ドライバーが 1 つのメッセージを処理するのに 200 ~ 500 マイクロ秒かかるようです。それはかなりの食い違いです。本当の問題は、ドライバー ソフトウェアよりも低レベルの何かが、ドライバーが追いつけないにもかかわらず、メッセージを送信するのと同じ速度でマイクロコントローラーに ACK を送信していることです。そのため、それに基づいて調整することはできません。ドライバーがメッセージを受信するたびに、「別のメッセージを受信する準備ができています」というメッセージをドライバーから BULK Out パイプのマイクロコントローラーに明示的に送信する必要があるようですが、それは本当に遅くなるようです物事がダウンします。より良い代替手段はありますか?