首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回ERROR_OPERATION_ABORTED的COM端口上的Win32重叠读文件

返回ERROR_OPERATION_ABORTED的COM端口上的Win32重叠读文件
EN

Stack Overflow用户
提问于 2008-11-20 23:07:14
回答 2查看 9.6K关注 0票数 3

好吧,给蜂巢思维的人来一杯……

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

在尝试检查一台新设备时,我的代码被995 ERROR_OPERATION_ABORTED错误淹没,在ReadFile之后调用GetOverlappedResult。有时读取会起作用,其他时候我会得到这个错误。忽略错误并重试将会--令人惊讶的--在不丢失任何数据的情况下工作。不需要ClearCommError。

这是代码片段。

代码语言:javascript
复制
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商业版32位,我的天啊。

在我把这个问题归结为“别人的问题”之前,有没有人知道是什么导致了这个问题?

EN

回答 2

Stack Overflow用户

发布于 2008-11-20 23:27:19

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

我担心责怪驱动程序(如果它是非MS的,而不仅仅是参考文献中的一个小调整)并不是完全不切实际的。编写COM驱动程序是一件令人难以置信的复杂事情,测试它的困难在于所编写的每个应用程序使用串行端口及其IOCTL的方式略有不同。

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

对于第三方COM驱动程序来说,这类东西可能是致命的,因为人们经常会用MS驱动程序中的任何旧东西逃脱惩罚,而且它在其他设备上并不总是同样有效。

票数 4
EN

Stack Overflow用户

发布于 2009-05-06 19:34:39

除了将重叠部分置零之外,您还可以检查设置olap.hEvent的方式,也就是说,您对CreateEvent的参数是什么?如果您正在创建一个预先发出信号的事件(即CreateEvent的第三个参数为真),我希望立即返回。此外,不要忘记,如果您将manualReset (CreateEvent的第二个参数)指定为FALSE,GetOverlappedResult()将帮助您清除事件-这可能解释了它第二次工作的原因。

我不能从你的代码片段中分辨出它们是否会影响到你--希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/307243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档