gpt4 book ai didi

c++ - COM 端口上的 Win32 重叠读取文件返回 ERROR_OPERATION_ABORTED

转载 作者:太空狗 更新时间:2023-10-29 21:09:29 27 4
gpt4 key购买 nike

好吧,一个是为了 SO hive 思维...

我的代码 - 直到今天 - 在许多系统上运行良好,并部署在许多站点。它涉及线程从串行端口读取和写入数据。

尝试检查新设备时,我的代码被 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 端口驱动程序,我以前从未使用过它(它是 Blackmagic Decklink 上的 RS422 端口,仅供引用),但这感觉就像是逃避。

哦,还有 Vista SP1 Business 32 位,我的罪过。

在我将其归结为“其他人的问题”之前,有没有人知道可能导致这种情况的原因?

最佳答案

如何设置 ReadFile 之前的 OVERLAPPED 结构? - 我总是将它们归零(显然除了 hEvent),这可能是迷信的一部分,但我觉得这在过去给我带来了问题。

恐怕责怪驱动程序(如果它不是 MS 而不仅仅是引用的微小调整)并非完全不现实。编写 COM 驱动程序是一件非常复杂的事情,测试它的困难在于每个编写的应用程序使用串行端口及其 IOCTL 略有不同。

另一个常见问题是不设置整个端口 - 例如不调用 SetCommTimeouts 或 SetupComm。我不知道你是否犯了这种错误,但我遇到过一些人,他们说他们没有使用超时,而实际上他们的意思是他们没有调用 SetCommTimeouts 所以他们正在使用它们但没有一个他们将要做什么的概念......

对于 3rd 方 COM 驱动程序来说,这种东西可能是谋杀,因为人们经常对 MS 驱动程序的任何旧废话都避而远之,而且它并不总是与其他设备一样工作。

关于c++ - COM 端口上的 Win32 重叠读取文件返回 ERROR_OPERATION_ABORTED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/307243/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com