我使用的设备驱动程序偶尔会错过来自硬件的中断。
要从设备中读取数据,我使用
函数 BOOL WINAPI ReadFile(
__in HANDLE hFile,
__out LPVOID lpBuffer,
__in DWORD nNumberOfBytesToRead,
__out_opt LPDWORD lpNumberOfBytesRead,
__inout_opt LPOVERLAPPED lpOverlapped
);
当设备驱动程序错过中断时,该函数将永远阻塞。这将导致程序停滞,并且必须重新启动窗口来解决它。
为了解决这个问题,我想在调用Readfile()时使用超时限制。但是当我使用
BOOL WINAPI SetCommTimeouts(
__in HANDLE hFile,
__in LPCOMMTIMEOUTS lpCommTimeouts
);
失败,错误码为87(无效参数)。显然,我不能在设备驱动程序句柄上使用这个超时的东西。我该如何解决这个问题?是否有其他方法可以在设备驱动程序上设置超时限制?
谢谢
您需要切换到异步I/O。打开为CreateFile提供FILE_FLAG_OVERLAPPED标志的设备驱动程序,然后在调用ReadFile时传递一个overlapped结构。当i/o完成时,句柄将被发出信号,因此您可以使用WaitForSingleObject,其中提供传递给ReadFile的句柄和超时。
不是所有的设备驱动程序都支持异步I/O,所以这可能不适合你。如果是这种情况,ReadFile仍然会阻塞并且不会返回"ERROR_PENDING_IO"。
如果超时,还应该在重叠结构超出作用域之前调用CancelIO来终止ReadFile。否则,如果操作在稍后完成,它将尝试写入重叠结构所在的内存。
Asynch i/o有点棘手,所以请仔细阅读文档。
Update:我想到了另一种方法,您可以从看门狗线程调用CancelIEx。作为一个较新的API,它可能不存在于您必须支持的平台上。