仮想 COM ポートになりすました、応答しない USB デバイスを修正しようとしています。手動での再接続は機能しますが、これらのユニットが最大 12 個ある場合があります。プラグの抜き取り/再プラグのサイクルに相当するプログラムを実行する API コマンドはありますか?
13 に答える
Devcon.exe を使用して "削除" してから "再スキャン" するのはどうですか?
DR
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;
}
残念ながら、私が知っているものはありません。USB 接続を物理的に外すと、プルアップ抵抗を使用して特定の電子的な処理が行われ、デバイスがプラグが抜かれていることが認識されます。物理的にプラグを抜かずにこの状態をシミュレートできるホストに遭遇したことはありません。
考え: デバイス マネージャーで、コンピューターのアイコン (デバイス ツリーの上部) を右クリックし、「変更をスキャン」できます。100%確かではありませんが、USB デバイスを「取り出し」(ソフトウェアの「プラグを抜く」と同等)、ハードウェアの変更をスキャンすると、実際にはポートから離れていなくても、バックアップが表示されると思います。
私が正しければ、Microsoft.Win32.Shell クラスを使用して、[コントロール パネル] --> [管理ツール] --> [デバイス マネージャー] を開き、コンテキスト メニュー項目を実行することをエミュレートできる可能性があります。とにかく、それは一見の価値があります。
ここにいくつかの実践的なガイダンスがあります:
http://digital.ni.com/public.nsf/allkb/1D120A90884C25AF862573A700602459
これはもっとハードコアです:
http://support.microsoft.com/kb/311272
devcon.exeを使用すると、私の問題ではなく、いくつかの問題が解決する可能性があると思います。USBポートのアレイを備えたボックスを構築でき、MCUによって制御されるFETで電力線が遮断されるとします。MCUは、RS-232などの基本的で信頼性の高いものを話す必要があります。恐ろしいハードウェア作業を簡素化するarduinoボードがあるかもしれません。
しばらく前に、カー コンピューター プロジェクトでこれを行わなければなりませんでした。タッチスクリーン ドライバーは休止状態に入ることを好まず、コンピュータが休止状態から復帰したときに再接続する必要がありました。私がそれを解決した方法は、DigitalRacerが提案したようにDevcon.exeを使用することでした。ただし、トリックは、コントローラーの削除/再スキャンが機能しないことでした。デバイスから上流のハブで削除/再スキャンを実行する必要がありました (その後、接続されているすべてのデバイスが切断されました)。
自動テストについてこれを見てきました。私たちが思いついた最善の解決策は、USB ハブが電力を消費しすぎたときにデバイスを切断する機能のようです。USB の観点から、USB ホストがハブにそうするように指示する可能性があるようです。デバイスが 12 台の場合、ハブが存在することになるため、そのパスを調査することをお勧めします。
Greg Hewgillが言ったように、私はそれが可能だとは思いません。
USB スタートアップ全体の開始は、USB スレーブ (この場合はデバイス) によってトリガーされます。USB ホスト (PC) はデバイスにメッセージを送信してシャットダウンするように指示できますが、シャットダウンが完了すると、デバイスが再び起動する必要があります。ホストは強制できません。
さらに悪いことに、USB デバイスが (電力線上の USB 電圧を検出することによって) プラグが挿入されていることを検出して起動する可能性が非常に高くなります。これは特にバスパワーのデバイスに当てはまります。
あなたの状況と、USBドライブをアンマウント/再マウントしようとするケースとは違いがあるようです。USB ドライブがアンマウントされている場合、PC で列挙されたままにできない理由はありません。USBドライブを実際にリセットするのではなく、ファイルシステムを非アクティブにするだけです。
これを使用して、プログラム可能な USB デバイスの切断を行いました。
特定のホスト マシンにこれらが複数ある場合は、それらをマシンから専用の専用 USB ハブに接続することで、時間とフラストレーションを節約できます。一度にデバイス。
もちろん、あなたはおそらくそれについて考えたことがあるでしょう。:-)
デバイス自体がこれを実行できる場合があります (つまり、USB 切断/再接続シーケンスを実行します)。
デバイスの製造元に連絡しましたか、または製造元の場合は、それを設計した EE に連絡しましたか?
USB 組み込みデバイスを設計したときにこれを行う必要がありました。プログラミングは USB を介して実行できますが、プロセスを完了するために、デバイスをいくつかのポイントで切断および再接続できる必要がありました。
それを超えて、デバイスマネージャーでUSBホストデバイスを無効にし(これはソフトウェアで実行できると思います)、再度有効にするというブルートフォースの方法があります。
少なくとも、Phidget には USB 制御のリレー ボードがあり、これを使用して電源または USB ライン自体をハブまたは個々のデバイスに接続できます。
-アダム
USBドライブをプログラムでアンマウントすることはできますが、コードを介して再マウントできるかどうかはわかりません。
C# を使用した USB ディスクの取り出し( The Code Project ) で、次を探します。
CM_Request_Device_Eject関数
これは、デバイス (排出可能な任意のデバイス) を排出する SetupApi 関数です。デバイス インスタンス ハンドル (または devInst) を入力として受け取ります...