如果你也像我一樣,遇到了不知道如何正確的使用子線程去操作串口的問題,建議你看一下下面我的粗略見解,希望你能有所收獲。如有不正之處,希望指出。
創建一個帶UI的項目,添加Object類來對串口操作進行封裝。Object類中繼承QObject,可以在這個類中定義一些槽函數,例如初始化串口、打開串口、關閉串口的一些串口操作。
這里是我的Object中,初始化串口函數
1 void Object::InitSerialPortInfo() 2 { 3 qDebug()<<"Object Init threadId:"<<QThread::currentThreadId(); 4
5 m_pSerial = new QSerialPort(this); 6 m_pSerial->setPortName("COM4"); 7 m_pSerial->setBaudRate(QSerialPort::Baud115200); 8 m_pSerial->setDataBits(QSerialPort::Data8); 9 m_pSerial->setStopBits(QSerialPort::OneStop); 10 m_pSerial->setParity(QSerialPort::NoParity); 11 }
接下來就是在mainwindows構造Object類,同時構造一個QThread的子類,但是注意不要指定父對象(不要加this),
1 thread->quit(); 2 thread->wait(); 3 thread->deleteLater();
運行可以發現,mainwindow和Object的確沒有運行在同一個線程中。
最后,一些注意事項。
通過obj->movetothread(thread)並不是將Object中所有的函數都移動到子線程當中。只有通過槽函數連接的才在子線程中,你可以qDebug()其currentThreadId多試試。
剩余的對串口的一些讀取,操作就可以通過Qt的信號槽來實現了。是不是非常簡單呢。
覺得對你有幫助的可以點個贊,謝謝!