質問: true)] internal static extern Boolean WinUsb_ReadPipe(IntPtr InterfaceHandle, Byte PipeID, Byte[] Buffer, UInt32 BufferLength, ref UInt32 LengthTransferred, IntPtr Overlapped); ・・・となっています。これは、VBでもVC++でも同等の記述になっています。この3言語のアプリでも上述の通りです。 以上、よろしくお願い申し上げます。
回答: 業務上で知りえた知識がほとんどなので詳細情報はあまり紹介できませんが、これだけUSBが普及した現在でも、USBホストコントローラーのバグ(エラッタ)やホストコントローラーとUSBデバイスの相性問題、USBコネクタやケーブルのちょっとした品質の違い(USB規格内であっても)や周辺回路の品質に起因して、USB通信異常が発生するという事は普通あります。(あとwindowsのUSBドライバの問題というのも) 特定の環境でのみ異常が発生する場合は、まずはUSBバスアナライザでPC側の問題の可能性が高いのか、USBデバイス側の問題の可能性が高いのかを切り分けるのが出発点ですね。 USBバスアナライザをお持ちでない場合、OSに組み込まれている USB Event Tracing for Windows の機能を使用すれば、少しは問題箇所部分の推定に役立ちますが、やはりUSBプロトコルレベルで詳細の異常タイミングがわかるバスアナライザでの調査は必須ですね。 * ETW イベントを使った USB デバイスに関する問題のデバッグ.aspx) * USB Event Tracing for Windows 7 > > デバイスが送っている応答を受信できません。 > > > という事なのですが、この辺はどこまで詳細に異常内容は把握できていますでしょうか? コントロール転送やバルク転送を使用した上位の独自プロトコルレベルでの応答を受信できないという事しかわかっていないのであれば、残念なが問題個所がPC側なのかUSBデバイス側なのかは判断出来ませんね。 それらを判断するためには、USBプロトコルのACK,NAKレベルで異常発生内容の情報が必要です。 (さらに稀ですが、USBバスアナライザの情報だけでも不十分で、オシロスコープでのアナログレベル調査が必要な場合もあります) また別の観点ですが、「どのようなUSBホストコントローラー(チップセット)」と「どのような形態で接続されていて」「同じホストコントローラーに接続さている他のUSBデバイスは何か」の情報も最初に正確に確認することも重要です。 例えば、 * IntelチップセットのUSBの実装がいつの間にか変わってた件 とあるように、チップセットが変わることにより、昔はUSB1.1とUSB2.0は別のホストコントローラーが処理していたのが、現在はUSB1.1とUSB2.0の通信を同じホストコントローラーが処理することになり、USBデバイス間の干渉(特定のUSBデバイスの問題が別のUSBデバイスの通信に影響)する事が発生しやすくなっています。 なので、USBデバイスの接続コネクタ位置を変えるだけで問題が発生したりしなかったりという事もあります。 さらに、ホストコントローラーのチップセットが特定出来たら、インテルなどのホームページでチップセットのエラッタ情報も確認することをお勧めします。 残念ながら、インテルの最新のチップセットであっても、未対応のUSB関連のエラッタは普通に存在します。 (さらに、インテルも認識出来ていないけど明らかにチップセットの問題という現象も見たことが有ります) ただ、発生現象がエラッタに起因するものかどうかの判断するためにも、やはりUSBプロトコルレベルでの異常の詳細(USBバスアナライザの情報)が必要になってきますが・・・