Visual c++ 断开USB电缆并重新连接后,FTDI D2XX取消重叠IO(OIO)

Visual c++ 断开USB电缆并重新连接后,FTDI D2XX取消重叠IO(OIO),visual-c++,usb,ftdi,overlapped-io,Visual C++,Usb,Ftdi,Overlapped Io,我的应用程序使用基于USB的FTDI芯片和D2XX驱动程序。它使用OIO(重叠IO)读取和写入USB。我的要求包括30秒的超时,这是我无法减少的。代码看起来非常健壮和稳定 一个新的要求是克服无意中断开和重新连接USB电缆(护士将电缆踢出) 在从windows接收到设备删除消息并确定它是我们的FTDI设备后,我发现在上一个OIO调用超时(要求的30秒超时)之前,我无法从OIO重新连接上接收新数据 一旦发现断开连接,我将循环执行以下调用,直到获得所有排队的OIO: bool CancelOIO()

我的应用程序使用基于USB的FTDI芯片和D2XX驱动程序。它使用OIO(重叠IO)读取和写入USB。我的要求包括30秒的超时,这是我无法减少的。代码看起来非常健壮和稳定

一个新的要求是克服无意中断开和重新连接USB电缆(护士将电缆踢出)

在从windows接收到设备删除消息并确定它是我们的FTDI设备后,我发现在上一个OIO调用超时(要求的30秒超时)之前,我无法从OIO重新连接上接收新数据

一旦发现断开连接,我将循环执行以下调用,直到获得所有排队的OIO:

bool CancelOIO()
{
    if (!FtdiRemaining)
        return false;

    FT_SetTimeouts(FtdiHandle, 1, 1);
    FT_W32_PurgeComm(FtdiHandle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);

    while (FtdiRemaining)
    {
        DWORD nBytes = 0;
        if (!FT_W32_GetOverlappedResult(FtdiHandle, &FtdiOverLap[FtdiQindex], &nBytes, FALSE))
        {
            if (FT_W32_GetLastError(FtdiHandle) == ERROR_IO_INCOMPLETE)
                return true;

            if (FT_W32_GetLastError(FtdiHandle) != ERROR_OPERATION_ABORTED)
            {
                CString str;
                str.Format("FT_W32_GetOverlappedResult failed with %d\r\n", FT_W32_GetLastError(FtdiHandle));
                SM_WriteLog(str, RGB_LOG_NORMAL);
            }
        }

        FtdiRemaining--;
        FtdiTodo++;
        FtdiQindex++;
        if (FtdiQindex >= FtdiQueueSize)
            FtdiQindex = 0;
    }

    return !!FtdiRemaining;
}
我将超时时间设置为1ms。这似乎不会更改以前计划的OIO的超时

我打电话给
FT\u W32\u purgecom
取消了一切。这似乎也不会取消OIO

我尝试调用
CancelIo
,但返回了一个错误,句柄无效。我的理解是,由驱动程序代码来响应它。可能是因为断开了连接

无论如何,我在一个循环中调用上面的代码,直到获得所有计划的OIO。30秒之内什么也没发生。然后所有的OIO似乎在不到1毫秒的时间内结束

作为对这段代码的测试,我在连接USB电缆的情况下调用了它,它在1ms后返回

因此,问题似乎在于拔下电缆时

问题: 我错过了什么? 我还能打别的电话吗? 这是虫子吗

我尝试过的其他事情: 在调用
FT\u W32\u GetOverlappedResult
之前关闭句柄。这将导致快速返回。但我的应用程序无法再从新句柄接收数据。奇怪的有人知道为什么吗

不调用此代码。应用程序能够从新句柄接收新数据,但只有在这些超时之后。为什么?


自行车码头。这不会导致这些OIO更快返回。在这些超时之前,它不会更改OIO接收数据的使用

经过反复测试,我发现有两种截然不同的行为。最快的返回速度相当快,取消了OIO。另一个使用了完整的30秒超时


尝试减少超时以减少取消OIO的延迟。

我在重复测试后发现两种不同的行为。最快的返回速度相当快,取消了OIO。另一个使用了完整的30秒超时

尝试减少超时以减少取消OIO的延迟