C++ 设备驱动程序:Windows ReadFile函数超时
我使用的设备驱动程序偶尔会错过来自硬件的中断 要从设备读取数据,我使用函数C++ 设备驱动程序:Windows ReadFile函数超时,c++,windows,timeout,device-driver,readfile,C++,Windows,Timeout,Device Driver,Readfile,我使用的设备驱动程序偶尔会错过来自硬件的中断 要从设备读取数据,我使用函数 BOOL WINAPI ReadFile( __in HANDLE hFile, __out LPVOID lpBuffer, __in DWORD nNumberOfBytesToRead, __out_opt LPDWORD lpNumberOfBytesRead, __inout_opt LPOVERLAPPED lpOverl
BOOL WINAPI ReadFile(
__in HANDLE hFile,
__out LPVOID lpBuffer,
__in DWORD nNumberOfBytesToRead,
__out_opt LPDWORD lpNumberOfBytesRead,
__inout_opt LPOVERLAPPED lpOverlapped
);
当设备驱动程序错过一个中断时,此功能将永远阻塞。这会导致程序暂停,必须重新启动windows才能解决此问题
为了解决这个问题,我想在调用Readfile()时使用超时限制。但是当我使用
BOOL WINAPI SetCommTimeouts(
__in HANDLE hFile,
__in LPCOMMTIMEOUTS lpCommTimeouts
);
失败,错误代码87(参数无效)。显然,我不能在设备驱动程序句柄上使用这个超时的东西。我怎样才能解决这个问题?是否有其他方法来设置设备驱动程序的超时限制
谢谢您需要切换到异步I/O。打开提供文件\u标志\u重叠标志的设备驱动程序,然后在调用时传递重叠结构。当i/o完成时,将向句柄发送信号,这样您就可以使用传递给ReadFile的句柄和超时 并非所有设备驱动程序都支持异步I/O,因此这可能并不适用于您。如果是这种情况,则仍将阻塞,并且不会返回“ERROR\u PENDING\u IO” 如果超时,还应该在重叠结构超出范围之前调用kill来终止ReadFile。否则,如果它碰巧稍后完成,它将尝试写入用于生存的重叠结构的内存 异步i/o有点棘手,所以请仔细阅读文档
更新:我遇到了另一个选择,您可以从看门狗线程调用它。作为一个较新的API,它可能不存在于您必须支持的平台上。可能库对您很有用。SetCommTimeout用于串行I/O,而不是通用设备驱动程序I/O。