什么可以导致串口上的CreateFile调用非常慢?

Mic*_*hne 11 c++ windows serial-port

我有一个Qt应用程序(Qt 4.8.1)正在做一些Windows串口任务.我发现有时我打开串口的CreateFileA调用最多需要30秒才能完成!显然我正在做一些事情来触发这种奇怪的行为,我想知道我可能做的是什么导致这种情况.

m_portHand = CreateFileA( portDevice.c_str(),
                          GENERIC_READ | GENERIC_WRITE,
                          0,      //  must be opened with exclusive-access
                          NULL,   //  default security attributes
                          OPEN_EXISTING, //  must use OPEN_EXISTING
                          FILE_FLAG_OVERLAPPED,      //  overlapped I/O
                          NULL ); //  hTemplate must be NULL for comm devices
Run Code Online (Sandbox Code Playgroud)

m_portHand是一个HANDLE,portDevice是一个std :: string并包含"COM5".

此调用是由我的应用程序主线程中的按钮按下触发的.当它发生时,应用程序最多只有一个其他线程,但那些线程(如果有的话)是空闲的.

系统中唯一的主要功能是运行Linux的虚拟机,但系统是四核的,其中3个核心就像你在Windows机箱上看到的那样几乎处于空闲状态,只有一个在VM上做任何事情.

串口是8端口USB串口盒,可能是相关的吗?

这是否与Overlapped IO有某种关系?

回应评论:

端口未被其他应用程序打开.之前通过此应用程序的调用打开了端口,该应用程序已正确关闭,端口以"CloseHandle"关闭.

我无法确定它与30秒之间的任何相关性 - 有时我启动应用程序,单击按钮我们即将参加比赛,有时需要30秒.

VM正在拦截同一串行盒上的其他一些USB设备.

除了串行盒(VM轮询4个端口寻找设备),USB总线被卸载.

我没有看到其他应用程序中的行为.我将尝试切换到内置端口(主板上的COM1),看看是否有任何影响.

我想到了一个想法:端口寻址的形式可以与它有什么关系吗?我工作的其他类似应用程序使用qestserialport库,它使用'\\.\ COM#'表示法打开端口.是否有某种方式使用的符号会影响时间?

USB串行设备在其上显示"VScom",通常它立即打开(CreateFile调用<10毫秒).这只是一个偶然的事情,事情变得充实,我有其他程序,似乎从来没有表现出这种行为.

我正在谈论的设备是使用IEEE 11073协议的医疗监视器.无论如何,我与设备的连接工作正常,只有串口打开才有问题.串口控制线在开放时间的状态是否与此有关?另一端的设备正在轮询它的端口,寻找各种可以交谈的东西,所以我不知道在出现问题的时候串行线路是什么样的.

Mic*_*hne 1

好吧,问题就算没有解决,也明白了。我正在使用不同的串行设备,问题开始更加频繁地出现。

问题似乎是,当虚拟机控制某些串行端口时,驱动程序打开可用端口的速度会间歇性变慢。

我的测试程序打开然后关闭端口 1000 次,对打开调用进行计时。它不以任何方式设置串行端口参数。在运行测试程序之前,我正在使用波特率 460800 的设备进行实际工作。

当 VM 拥有 4 个端口时,打开其余 4 个端口有时(1000 次尝试中的 20-30 次)需要 20-30 秒才能完成。当 VM 未运行时,所有 1000 次尝试都会快速打开。在虚拟机运行但没有 USB 串行端口的情况下,在所有 1000 次尝试中,打开速度很快。

由于虚拟机是一个开发工具,而不是我们预期部署场景的一部分,因此我可以忍受这个问题。

有趣的是,这种效果似乎取决于端口上次使用的波特率。在我最初询问之前,我一直在 9600 波特及以下的速率下运行,不记得曾经遇到过这个问题。当我第一次问这个问题时,我正在使用 115000 波特率的设备,并且间歇性地遇到问题。使用 460800 波特率的最新设备,我经常遇到问题,从而能够找到问题所在。不知道为什么,但就是这样。