我正在开发一种与一些科学设备交互的新仪器的软件。用户界面通过Windows CE Pocket PC (Windows CE 600 V3.01 Build 195) 实现。该仪器设置为一根柔性电缆的一端始终插入 PC 上的 SD 卡插槽。电缆插入仪器,另一端插入已安装的 SD 卡(如果存在)。 SD 卡包含与仪器一起使用的芯片,以及所需的软件/固件更新以及与芯片相关的数据文件。我有一个在 WinCE 启动时运行的 C# 软件应用程序。该应用程序检查 SDMMC 卡是否存在,因为它取决于与附带芯片相关的数据来实现某些功能。
我的问题:如果在 WinCE 启动时将 SD 卡插入柔性电缆的另一端,则 winCE 会检测到该卡的存在,并创建 \SDMMC 文件夹,允许软件读取数据。如果仅插入柔性电缆,但另一端不存在 SDMMC 卡,则 Windows 不会创建该文件夹。这是我所期望的。但我们的现场工程师会因为各种原因插拔卡以在软件处于活动状态时更换芯片。如果在插入卡之前启动 Windows,则会出现问题。由于使用柔性电缆,WinCE 永远不会检测到卡已插入。它也从未检测到它已被删除。
软件每 5 秒轮询一次 SD 卡。固件可以通过位设置判断卡是否已插入,并将此信息转发给软件。如果该卡以前不存在,现在被检测到,但 \SDMMC 文件夹不存在,我想要软件触发 WinCE 再次尝试检测。我考虑过使用注册表值,但不清楚 HKEY_LOCAL_MACHINE SDMMc 值是否可以写入。我也不太确定这些值的含义。可以重置这些值吗?我看到存储管理器注册表将其定义如下:
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMMC]
"Name"="SD MMC device"
"Folder"="SD Card
有没有办法读/写这个注册表来戳winCE以查看电缆的另一端是否插入了卡?我的这个想法完全不对吗?还有其他方法可以做到这一点吗?
对于这个长问题我深表歉意。我一般都是玩应用层面的。谷歌搜索这个问题并没有给我我需要的答案,尽管也许我不知道足够的知识来提出正确的问题。感谢你给与我的帮助。
更新:我仍在尝试找到解决此问题的方法。我当前的想法是,当我的仪器固件检测到卡已插入时,强制 Windows CE 重新枚举设备。我的代码轮询固件以在我的 C# 应用程序中接收此通知。对于我的仪器/应用程序,SD 卡始终位于“Dsk2:”中。当 C# 应用程序收到 SD 卡已插入的通知时,它会调用执行以下操作的方法:
CODE
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);
/CODE
在上面,CreateFile() 调用失败并出现错误 55:“指定的网络资源或设备不再可用”。
我的问题:我尝试做的重新枚举设备合理吗? CreateFile 错误是否表明我应该进行 ActivateDevice() 调用?我在这里看到一个例子:在启动时加载设备驱动程序时出现问题 - WM6.1 https://stackoverflow.com/questions/3585333/problems-getting-a-device-driver-to-load-at-startup-wm6-1有人从 C# 代码调用 ActivateDevice(),想知道这是否可以解决让 WIndows CE 识别出 SD 卡已插入的问题。谁能帮助我了解要发送到窗口的ActivateDevice()命令的参数是什么?我对这种方法有偏差吗?
这对我来说是全新的领域,我感谢您提供的任何帮助。谢谢。