我正在使用QT连接到硬件串行设备,我基于我的应用程序大致围绕终端示例,但由于通信需要非常同步,因此串行处理程序生活在另一个线程。该连接通过一个2xRS232连接到带有FTDI芯片组的USB适配器。关闭串口的正确方法QT
串行通信很好,我可以连接,发送命令等。但是,当我退出并重新加载应用程序时,串行端口似乎被阻止。
让COM1为连接的设备,COM2未连接。
如果我运行该程序,做一些与硬件通话并退出,下一次运行程序(数据LED不会在适配器上闪烁)时不能再连接到COM1,除非我尝试首先连接到COM2。一旦我尝试过,我可以像往常一样连接回COM1。在硬件的参考实用程序中没有看到这种行为,因此必须以某种方式处理端口。
我身边的代码是:
void mydevice::closeSerialPort()
{
this->stop();
serial->close();
emit serialClosed();
emit log("Serial port closed.");
}
serial
是QTSerialPort
。首先发送一个停止命令来关闭硬件(与问题无关,这只是一种方便),然后我发送一个关闭命令给串口。
我有我的主窗口中的子类的QWidget,要求退出该命令:
/* In the constructor */
connect(this, SIGNAL(WindowClosed()), mydevice, SLOT(closeSerialPort()));
void mainwindow::closeEvent(QCloseEvent *event)
{
emit WindowClosed();
event->accept();
}
没有任何理由为这种行为?我假设我以某种方式阻止港口开放,但肯定会抱怨它已经开放。
另一个奇怪的问题是,说设备是在COM1上,我在我的应用程序中打开它,COM1在其他实用程序中无响应,设备出现在COM2上。但是,当我切换回我的程序并拨弄一下时,设备再次出现在COM1上(尽管总是在另一个应用程序的COM2中)。
我使用的是通用QT库,因为代码很可能以各种系统结束,其中一些内置串行端口(旧套件!),其中一些可能使用Prolific驱动程序等。 我玩了更多,甚至只有在需要的波特率工程未使用的端口尝试。例如该设备工作在115200波特。如果我尝试使用9600打开COM2,然后在115200打开COM1,请使用zip。如果我尝试COM2与115200,然后COM1,它的工作原理。 程序肯定被终止,QT Creator获取程序的返回码,任何东西都不会出现在taskmgr中。 – Josh