web-dev-qa-db-ja.com

プログラムで任意のUSBデバイスを取り外して再接続する方法

仮想COMポートになりすましている応答しないUSBデバイスを修正しようとしています。手動での再接続は機能しますが、これらのユニットが最大12台ある場合があります。アンプラグ/リプラグサイクルと同等のプログラムを実行するAPIコマンドはありますか?

34
Dean

Devcon.exeを使用して「削除」してから「再スキャン」するのはどうですか?

DR

9
DigitalRacer

C#Hardware Helper Lib を使用して、 ResetDevice関数 を追加できます。

public bool ResetDevice( IntPtr hDevInfo, IntPtr devInfoData )  
// Need to add  
// public const int DICS_PROPCHANGE = ((0x00000003));   
// at the public class Native under //PARMS  
int szOfPcp;  
IntPtr ptrToPcp;  
int szDevInfoData;  
IntPtr ptrToDevInfoData;  

Native.SP_PROPCHANGE_PARAMS pcp = new Native.SP_PROPCHANGE_PARAMS();  
pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER));  
pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE;  
pcp.StateChange = Native.DICS_PROPCHANGE; // for reset  
pcp.Scope = Native.DICS_FLAG_CONFIGSPECIFIC;  
pcp.HwProfile = 0;  

szOfPcp = Marshal.SizeOf(pcp);  
ptrToPcp = Marshal.AllocHGlobal(szOfPcp);  
Marshal.StructureToPtr(pcp, ptrToPcp, true);  
szDevInfoData = Marshal.SizeOf(devInfoData);  
ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData);  
Marshal.StructureToPtr(devInfoData, ptrToDevInfoData, true);  

bool rslt1 = Native.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp,   Marshal.SizeOf(typeof(Native.SP_PROPCHANGE_PARAMS)));  
bool rstl2 = Native.SetupDiCallClassInstaller(Native.DIF_PROPERTYCHANGE, hDevInfo,   ptrToDevInfoData);  

if (rslt1 && rstl2)  
{  
    return true;  
}  
return false;  
}  
4
shahar_m

残念ながら、私が知っているものはありません。 USB接続を物理的に外すと、プルアップ抵抗を使用して特定の電子的処理が行われ、デバイスが接続されていないことがわかります。物理的なプラグを抜かずにこの状態をシミュレートできるホストに遭遇したことがありません。

3
Greg Hewgill

考え:デバイスマネージャーの下で、コンピューターアイコン(デバイスツリーの上部)を右クリックして、[変更をスキャン]できます。 100%確実ではありませんが、USBデバイスを「イジェクト」し(ソフトウェアの「プラグを抜く」相当)、ハードウェアの変更をスキャンすると、実際にはポートを離れなかったとしても、表示されます。

私がそれについて正しい場合、Microsoft.Win32.Shellクラスを使用して、コントロールパネル->管理ツール->デバイスマネージャーを開いてコンテキストメニュー項目を実行することをエミュレートできる可能性があります。とにかく、一見の価値があります。

2
Coderer

しばらく前に車のコンピュータープロジェクトでこれを行わなければなりませんでした。タッチスクリーンドライバーは休止状態に入るのが嫌いで、コンピューターが休止状態から戻ったときに再接続する必要がありました。私がそれを解決した方法は、DigitalRacerが提案したようにDevcon.exeを使用することでした。ただし、トリックは、コントローラーの削除/再スキャンが機能しないことでした。デバイスの上流のHUBで削除/再スキャンを実行する必要がありました(その後、接続されているすべてのデバイスが切断されました)。

1
Dolphin

私は自動テストのためにこれを見てきました。私たちが思いついた最善の解決策は、USBハブが電力を消費し過ぎたときにデバイスを切断できることです。 USBの観点から見ると、USBホストがハブにそのように指示している可能性があります。 12台のデバイスでハブができるので、その経路を調査することをお勧めします。

1
MSalters

ここにいくつかの実践的なガイダンスがあります:

http://digital.ni.com/public.nsf/allkb/1D120A90884C25AF862573A700602459

これはよりハードコアです:

http://support.Microsoft.com/kb/311272

Devcon.exeを使用すると、私の問題ではなく、いくつかの問題が解決する可能性があります。 MCUによって制御されるFETで電力線が遮断されているUSBポートの配列でボックスを構築できるとします。 MCUは、RS-232のような、基本的で信頼性の高いものを話す必要があります。怖いハードウェアの作業を簡素化するarduinoボードがあるかもしれません。

1
NoJoshua

Greg Hewgill が言ったように、それは可能ではないと思います。

USB起動全体の開始は、USBスレーブ(あなたの場合はデバイス)によってトリガーされます。 USBホスト(PC)は、デバイスにシャットダウンを指示するメッセージを送信できますが、完了したら、デバイスが再起動を開始する必要があります。ホストはそれを強制することはできません。

さらに悪いことに、USBデバイスが起動するプラグが(電源ラインのUSB電圧を検出することによって)検出されていることがわかります。これは特にバスパワードデバイスに当てはまります。


状況やUSBドライブをアンマウント/再マウントする場合とは異なるようです。 USBドライブがマウント解除されている場合、PCで列挙状態を維持できない理由はありません。実際には、USBドライブをリセットするのではなく、ファイルシステムを非アクティブにします。

1

プログラム可能な切断USBデバイスに this を使用しました。

0
Ilya

特定のホストマシンにこれらが複数ある場合は、それらをマシンから専用のUSBハブに接続することで、時間とフラストレーションを節約できます。一度にデバイス。

もちろん、あなたはおそらくそのことを考えたことがあるでしょう。 :-)

0
robsoft

デバイス自体がこれを実行できる場合があります(つまり、USB切断/再接続シーケンスを実行します)。

デバイスの製造元に連絡しましたか、または製造元の場合は、それを設計したEEに連絡しましたか?

USB組み込みデバイスを設計するときにこれを行わなければなりませんでした。プログラミングはUSBを介して行うことができましたが、デバイスはプロセスを完了するためにいくつかのポイントで切断および再接続できる必要がありました。

それ以外にも、デバイスマネージャーでUSBホストデバイスを無効にして(ソフトウェアで実行できると思います)、それを再度有効にするブルートフォースメソッドがあります。

他に何もない場合、Phidg​​etには電源またはUSBライン自体をハブまたは個々のデバイスに接続するために使用できるUSB制御のリレーボードがあります。

-アダム

0
Adam Davis