在我的项目中,我需要读写串口(RS232)。我使用重叠的IO,并使用两个单独的线程进行读写。
当我发出一个没有立即完成的写操作时,我就开始等待(WaitForMultipleObjects)两个事件:分配给重叠结构的hEvent成员的事件和一个停止事件。当我想停止线程时,我通过调用SetEvent()向停止事件发出信号。这将导致等待函数返回。因为写操作仍然挂起,所以我通过调用CancelIO()来取消操作。然后,我再次等待操作完成,现在使用GetOverlappedResult(),将bWait参数设置为True。操作完成后,GetOverlappedResult()返回False,GetLastError()返回ERROR_OPERATION_ABORTED。
现在我的问题是:
当GetOverlappedResult()返回False,而GetLastError()返回ERROR_OPERATION_ABORTED (指示已完成但已取消的操作)时,lpNumberOfBytesTransfered参数有效吗?换句话说,在取消之前,lpNumberOfBytesTransfered是否给出了实际的书面字节数?还是在本例中未定义lpNumberOfBytesTransfered参数?
发布于 2013-10-23 13:34:19
我将重复汉斯·帕桑特的评论,因为我认为他对我的问题给出了一个准确的答案:
这是驱动程序实现细节。有很多可能的串口驱动程序,它们经常被一个USB或BlueTooth设备驱动程序模拟。质量常有问题的。微软的标准驱动程序已经拒绝了,当IRP被取消时,它会将IRP.IOStatus.Information字段强制为0。如果无法承受数据丢失,请不要取消I/O。
https://stackoverflow.com/questions/19517842
复制相似问题