好的,一个适合蜂巢思维的人......
我的代码 - 直到今天 - 在许多系统上运行得很好,并且部署在许多站点上。它涉及线程从串行端口读取和写入数据。
尝试检查新设备时,我的代码在 ReadFile 之后调用 GetOverlappedResult 时出现 995 ERROR_OPERATION_ABORTED 错误。有时读取会起作用,有时我会收到此错误。只需忽略错误并重试即可 - 令人惊讶的是 - 不会丢失任何数据。不需要 ClearCommError。
这是片段。
if (!ReadFile(handle,&c,1,&read, &olap))
{
if (GetLastError() != ERROR_IO_PENDING)
{
logger().log_api(LOG_ERROR,"ser_rx_char:ReadFile");
throw Exception("ser_rx_char:ReadFile");
}
}
WaitForSingleObjectEx(r_event, INFINITE, true); // alertable, so, thread can be closed correctly.
if (GetOverlappedResult(handle,&olap,&read, TRUE) != 0)
{
if (read != 1)
throw Exception("ser_rx_char: no data");
logger().log(LOG_VERBOSE,"read char %d ( read = %d) ",c, read);
}
else
{
DWORD err = GetLastError();
if (err != 995) //Filters our ERROR_OPERATION_ABORTED
{
logger().log_api(LOG_ERROR,"ser_rx_char: GetOverlappedResult");
throw Exception("ser_rx_char:GetOverlappedResult");
}
}
我的第一个猜测是归咎于我之前没有使用过的 COM 端口驱动程序(它是 Blackmagic Decklink 上的 RS422 端口,仅供参考),但这感觉像是在逃避。
哦,还有 Vista SP1 Business 32 位,为我的罪过。
在我把它归结为“别人的问题”之前,有没有人知道可能导致这种情况的原因?