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协议的医疗监视器.无论如何,我与设备的连接工作正常,只有串口打开才有问题.串口控制线在开放时间的状态是否与此有关?另一端的设备正在轮询它的端口,寻找各种可以交谈的东西,所以我不知道在出现问题的时候串行线路是什么样的.
好吧,问题就算没有解决,也明白了。我正在使用不同的串行设备,问题开始更加频繁地出现。
问题似乎是,当虚拟机控制某些串行端口时,驱动程序打开可用端口的速度会间歇性变慢。
我的测试程序打开然后关闭端口 1000 次,对打开调用进行计时。它不以任何方式设置串行端口参数。在运行测试程序之前,我正在使用波特率 460800 的设备进行实际工作。
当 VM 拥有 4 个端口时,打开其余 4 个端口有时(1000 次尝试中的 20-30 次)需要 20-30 秒才能完成。当 VM 未运行时,所有 1000 次尝试都会快速打开。在虚拟机运行但没有 USB 串行端口的情况下,在所有 1000 次尝试中,打开速度很快。
由于虚拟机是一个开发工具,而不是我们预期部署场景的一部分,因此我可以忍受这个问题。
有趣的是,这种效果似乎取决于端口上次使用的波特率。在我最初询问之前,我一直在 9600 波特及以下的速率下运行,不记得曾经遇到过这个问题。当我第一次问这个问题时,我正在使用 115000 波特率的设备,并且间歇性地遇到问题。使用 460800 波特率的最新设备,我经常遇到问题,从而能够找到问题所在。不知道为什么,但就是这样。