我正在使用 QT 连接到硬件串行设备,我的应用程序大致围绕终端示例,但由于通信需要非常同步,串行处理程序位于另一个线程中。连接是通过带有 FTDI 芯片组的 2xRS232 到 USB 适配器。
串口通讯很好,我可以连接,发送命令等。但是,当我退出并重新加载应用程序时,串口似乎被阻塞了。
设 COM1 为已连接设备,COM2 未连接。
如果我运行程序,与硬件进行一些对话并退出,我将无法在下次运行程序时连接到 COM1(适配器上的数据 LED 不闪烁),除非我尝试连接到 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 中)。