我正在为与一些科学设备交互的新仪器开发软件。用户界面是通过 Windows CE 掌上电脑(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_MACHINE SDMMc 值。我也不太确定这些值的含义。可以重置这些值吗?我看到 Storage Manager Registry 将定义如下:
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMMC]
"Name"="SD MMC device"
"Folder"="SD Card
有没有办法读/写这个注册表来戳winCE看看卡已经插在电缆的另一端?我完全不同意这个想法吗?还有其他方法可以做到这一点吗?
我为这个冗长的问题道歉。我通常在应用程序级别玩。谷歌搜索这个问题并没有给我我需要的答案,尽管我可能没有足够的知识来提出正确的问题。感谢你给与我的帮助。
更新:我仍在尝试找到解决此问题的方法。我目前的想法是在我的仪器固件检测到卡已插入时强制 Windows CE 重新枚举设备。我的代码轮询固件以在我的 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() 调用?我在这里看到一个例子: Problems getting a device driver to load at startup - WM6.1 of someone calls ActivateDevice() from c# code 并想知道这是否会解决让 WIndows CE 识别 SD 卡现在的问题插入。谁能帮我理解要发送到窗口的 ActivateDevice() 命令的参数?我用这种方法离谱吗?
这对我来说是全新的领域,我感谢您提供的任何帮助。谢谢。