我正在使用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