私はいくつかの科学機器と相互作用する新しい機器のソフトウェアに取り組んでいます。ユーザーインターフェイスは、Windows CE Pocket PC(Windows CE 600 V3.01 Build 195)を介して行われます。機器は、フレックスケーブルの一方の端が常にPCのSDカードスロットに差し込まれている状態でセットアップされます。ケーブルは機器に接続され、もう一方の端は、取り付けられているSDカードが存在する場合は接続されます。SDカードには、機器で使用するためのチップ、必要に応じてソフトウェア/ファームウェアのアップデート、およびチップに関連するデータファイルが含まれています。WinCEの起動時に実行されるac#ソフトウェアアプリケーションがあります。このアプリケーションは、特定の機能について付属のチップに関連するデータに依存するため、SDMMCカードの存在をチェックします。
私の問題:WinCEの起動時にSDカードがフレックスケーブルのもう一方の端に挿入されると、winCEがカードの存在を検出し、ソフトウェアがデータを読み取れるように\SDMMCフォルダーが作成されます。フレックスケーブルのみが接続されていて、もう一方の端にSDMMCカードがない場合、Windowsはフォルダーを作成しません。これは私が期待しています。ただし、フィールドエンジニアは、ソフトウェアがアクティブなときにチップを交換するために、さまざまな理由でカードを交換します。これは、カードが挿入される前にWindowsが起動された場合に問題になります。フレックスケーブルが原因で、WinCEはカードが挿入されたことを検出しません。また、削除されたことを検出することもありません。
ソフトウェアは5秒ごとにSDカードをポーリングします。ファームウェアは、ビットの設定を介してカードが挿入されているかどうかを判断でき、この情報をソフトウェアに中継します。カードが以前は存在していなかったが、現在は検出されているが、\ SDMMCフォルダーが存在しない場合は、ソフトウェアでWinCEをトリガーして検出を再試行する必要があります。レジストリ値を使用することを考えましたが、HKEY_LOCAL_MACHINESDMMc値の存在を記述できるかどうかは明確ではありません。また、値が何を意味するのかよくわかりません。これらをリセットできますか?StorageManagerレジストリがこれを次のように定義しているようです。
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMMC]
"Name"="SD MMC device"
"Folder"="SD Card
このレジストリを読み書きしてwinCEを調べ、ケーブルのもう一方の端にカードが挿入されていることを確認する方法はありますか?私はこの考えで完全にベースから外れていますか?これを行う他の方法はありますか?
長い質問をお詫び申し上げます。私は通常、アプリケーションレベルでプレイします。この問題をグーグルで検索しても、必要な答えが得られませんでしたが、適切な質問をするのに十分な知識がない可能性があります。あなたが私に与えることができるどんな助けにも感謝します。
更新:私はまだこの問題の解決策を見つけようとしています。私の現在の考えは、機器のファームウェアがカードが挿入されたことを検出したときに、WindowsCEにデバイスを再列挙させることです。私のコードはファームウェアをポーリングして、私のc#アプリケーションでこの通知を受け取ります。私の機器/アプリケーションでは、SDカードは常に「Dsk2:」にあります。c#アプリケーションは、SDカードが挿入されたという通知を受け取ると、次のことを行うメソッドを呼び出します。
コード
hDevice = CreateFile("\\Dsk2:", (0x80000000) | (0x40000000), 0,
IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
if (hDevice == INVALID_HANDLE_VALUE)
{
int hDeviceError = Marshal.GetLastWin32Error();
// THis is an error - call GetLastERror to find
// out what happened.
using (StreamWriter bw = new StreamWriter(File.Open(App.chipDebugFile, FileMode.Append)))
{
String iua = "DevDriverInterface: error from CreateFile: " + hDeviceError.ToString();
bw.WriteLine(iua);
}
return false;
}
bResult = DeviceIoControl(hDevice,
IOCTL_DISK_UPDATE_PROPERTIES,
null,
0,
null,
0,
ref nBytesReturned,
nOverLapped);
/コード
上記では、CreateFile()呼び出しはエラー55で失敗します:「指定されたネットワークリソースまたはデバイスは使用できなくなりました」。
私の質問:デバイスを再列挙するために私がやろうとしていることは合理的ですか?CreateFileエラーは、代わりにActivateDevice()呼び出しを行う必要があることを示していますか?ここに例があります: 起動時にデバイスドライバーをロードする際の問題 -c#コードからActivateDevice()を呼び出す人のWM6.1は、WindowsCEにSDカードが現在あることを認識させる問題を処理するかどうか疑問に思います挿入されました。誰かがウィンドウのActivateDevice()コマンドに送信するパラメータを理解するのを手伝ってもらえますか?私はこのアプローチでオフベースですか?
これは私にとってすべて新しい領域であり、あなたが提供できるどんな助けにも感謝します。ありがとう。