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

我有一个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 

m_portHand是一个HANDLE,portDevice是一个std :: string并包含“COM5”。

这个调用是由我的应用程序的主线程中的button触发。 当它发生时,应用程序至多有一个其他线程,但这些线程(如果有的话)是空闲的。

系统中唯一主要的事情是运行Linux的虚拟机,但是系统是一个四核,而其中的三个核心就像你在Windows上看到的一样,只有一个虚拟机在做任何事情。

串口是在一个8端口的USB串行箱上,可以关联吗?

这是以某种方式与重叠的IO相关吗?

在回应评论时:

端口没有被另一个应用程序打开。 以前调用此应用程序时,端口以前是打开的,该应用程序已正确closures,并且端口用“CloseHandle”closures。

我还没有能够确定它之间的任何相关性需要30秒,而不是 – 有时我开始了应用程序,点击button,我们对比赛,有时需要长达30秒。

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

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

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

我想起了一个想法:端口编址的forms可以和它有什么关系吗? 我使用的其他类似应用程序使用qestserialport库,它使用'\\。\ COM#'表示法打开端口。 有什么方法可以影响时间?

USB串行设备上有'VScom',通常它会立即打开(CreateFile调用<10毫秒)。 这只是一个偶尔的问题,事情会被堵塞,而且我还有其他的程序从来不会出现这种行为。

我正在说的设备是使用IEEE 11073协议的医疗监视器。 无论如何,我有连接到设备工作得很好,只有串行端口打开是有问题的。 开放时间的串行控制线的状态是否与此有关? 在另一端的设备是轮询它的端口寻找各种各样的事情交谈,所以我不知道什么是串行线路在事情出错的时刻。

好的,问题是理解的,如果不解决的话。 我正在玩一个不同的串口设备,问题开始显得更加频繁。

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

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

当虚拟机拥有4个端口时,在其余4个端口上打开,有时候(1000次尝试中的20-30次)需要20-30秒才能完成。 当虚拟机未运行时,所有1000次尝试都会立即开启。 虚拟机运行,但没有USB串行端口,所有1000次尝试都会迅速开启。

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

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

串行控制线与设备驱动程序问题交互是一个可能的原因。

你的控制信号是否连接正确?

如果没有,请将RTS连接到CTS并连接CD,DTR和DSR。 在DB25上,这意味着连接引脚4和5以及连接引脚6,8和20.在DB9上,连接引脚7和8,并连接引脚1,4和6。

如果解决了这个问题,您应该查找驱动程序设置,忽略打开的控制信号。