WriteFile 返回错误代码 995

Posted

技术标签:

【中文标题】WriteFile 返回错误代码 995【英文标题】:WriteFile returning error code 995 【发布时间】:2013-11-25 08:33:56 【问题描述】:

我已经搜索了 *** 并彻底搜索了这个问题,但无法找到为什么会发生这个问题的线索。

我正在用 C++ 编写一个程序,它与通过 USB 连接的测量设备进行通信。该程序是多线程的,多个线程将与设备通信。互斥锁用于保证没有两个线程同时尝试从设备读取或写入。

使用WriteFile 将命令发送到设备,并使用ReadFile 读取响应和测量值 - 两个操作同步完成。

有时,从设备读取测量值时,测量会因超时而失败(GetLastError() 返回错误代码 121),这是由于测量设备本身内部的同步错误 - 这是正常且预期的。

当我尝试继续测量时,通过发送新命令有时会导致 WriteFile(大约 50% 的时间)失败,并且 GetLastError() 返回错误代码 995,在 MSDN 中描述为:

ERROR_OPERATION_ABORTED

995 (0x3E3)

The I/O operation has been aborted because of either a thread exit or an application request.

超时后没有线程退出,也没有取消任何读写操作。我只能通过使用 CloseHandle 和 CreateFile 关闭并重新打开与设备的通信来恢复通信。然而,这将需要一些时间来测量,并不是一个理想的解决方案。

我的问题是,为什么在这种情况下 WriteFile 会返回错误代码 995,我该怎么做才能避免关闭并重新打开与设备的通信?

【问题讨论】:

通讯失败时,您是否尝试过彻底关闭通讯通道并从头开始重新建立? IE。关闭后再打开新的? 是的,完全关闭并重新建立通信是我发现唯一有效的方法。我的问题是,这需要时间来测量并降低程序的性能。 USB 驱动程序是相当臭名昭著的麻烦制造者。如果您遇到任意超时错误,请不要期望会有很好的结果。寻找驱动程序更新,联系供应商寻求帮助。 我同意 Hans 的观点 - 您可能需要联系您的 USB 串行供应商。作为一名在这类技术上广泛工作的开发人员,我可以保证很难让事情看起来完全像一个真正的串行端口。当我看到这样的情况时,我们会为行为添加回归测试并修复它 - 希望您的供应商也能有同样的运气。 @HansPassant 似乎在meta 上达成了一些共识,将其作为答案发布是一件好事。 【参考方案1】:

请与您的 USB 串行设备的 OEM 联系 - 我们无法进一步帮助您,因为我们无权访问驱动程序的管道。如果设备 OEM 无法帮助您——请联系 USB 串行芯片组的制造商;如果他们拒绝提供帮助,请将 USB 转串口适配器扔进垃圾桶,并购买一个带有真正具有制造商支持的芯片组(例如 FTDI 或 Silicon Labs USB 串口芯片)的芯片,而不是一些廉价的克隆垃圾。

【讨论】:

以上是关于WriteFile 返回错误代码 995的主要内容,如果未能解决你的问题,请参考以下文章

根据 GetLastError 直接写磁盘导致错误代码 5

使用 EtherType 0x88A4 (EtherCat) 时,WriteFile 函数 (NDIS) 中出现错误 87

fs.writeFile 没有错误,但是写入文件失败

fs.writeFile 在新创建的 vue 项目中不起作用[重复]

Win32 WriteFile 因防病毒不返回

流程维度失败并显示消息“发生来自 WriteFile 的 FileStore 错误”?