首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >D2XX线缆断开并重新连接后,FTDI取消重叠IO

D2XX线缆断开并重新连接后,FTDI取消重叠IO
EN

Stack Overflow用户
提问于 2017-01-25 05:29:16
回答 1查看 292关注 0票数 1

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

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

一旦从windows接收到device removed消息并确定它是我们的FTDI设备,我发现我无法在重新连接时从OIO接收新数据,直到前面的OIO调用超时(来自要求的30秒超时)。

一旦我发现断开连接,我就循环下面的调用,直到所有排队的OIO都被收获:

代码语言:javascript
复制
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_W32_PurgeComm取消了一切。这似乎也不会取消OIO。

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

无论如何,我在一个循环中调用上面的代码,直到所有调度的OIO都被获取。30秒内什么都不会发生。那么所有的OIO似乎都在不到1ms的时间内结束。

作为对此代码的测试,我在连接USB电缆的情况下调用,它在1ms内返回。

因此,问题似乎出在电缆拔出的时候。

问题:我错过了什么?我还能再打个电话吗?这是一个bug吗?

我尝试过的其他事情:在调用FT_W32_GetOverlappedResult之前关闭句柄。这会导致快速返回。但我的应用程序不能再从新的句柄接收数据。真奇怪。有人知道为什么吗?

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

CyclePort。这不会导致这些OIO更快地返回。在这些超时之前,它不会改变接收数据的OIO的使用。

EN

回答 1

Stack Overflow用户

发布于 2017-12-28 03:51:08

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

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

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

https://stackoverflow.com/questions/41839318

复制
相关文章

相似问题

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