好的,这是一个关于IT技术的翻译请求...
我有一段代码,之前在许多系统上都运行良好,并部署在许多站点上。它涉及到从串口读写数据的线程。
在尝试检查新设备时,我的代码被大量的995 ERROR_OPERATION_ABORTED错误所淹没,在调用ReadFile后调用GetOverlappedResult。有时读取会成功,有时我会得到这个错误。只是忽略错误并重试 - 令人惊讶的是 - 可以在不丢失任何数据的情况下工作。不需要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端口驱动程序,我以前没有使用过(FYI,这是Blackmagic Decklink上的RS422端口),但这感觉像是推卸责任。
哦,对了,我用的是Vista SP1 Business 32位版本,真是自讨苦吃。
在我把这个问题归咎于“别人的问题”之前,有人有什么想法会导致这种情况吗?
WaitForSingleObjectEx
。你应该检查(1)dwWait == WAIT_OBJECT_0
或(2)dwWait == WAIT_TIMEOUT && dwError == ERROR_IO_PENDING
。 - jww