我一直在挣扎着一个项目,它通过Qt中的串口进行通信大约两周。首先我尝试了信号/插槽方法,它错过了一些数据。然后我决定用这个线程,但是我得到了相同的结果。当应用程序窗口被调整大小或最大化/最小化时,即使在窗口栏上按住鼠标左键,它也会错过一些数据。请帮助我解决这个问题。带线程的QSerialPort
的主窗口构造函数:
SerialPort *serial= new SerialPort();
serial->moveToThread(&cThread);
connect(this , &MainWindow::finished, &cThread, &QThread::quit);
connect(this , &MainWindow::destroyed, this, &SerialPort::deleteLater);
connect(serial, &SerialPort::getData, this, &MainWindow::displayData);
cThread.start();
串口读取线程:
void SerialPort::newData()
{
mutex.lock();
bArray.insert(bArray.length(),serial->readAll());
mutex.unlock();
emit getData(&bArray,&mutex);
}
一个串口构造:
serial = new QSerialPort();
connect(serial, &QSerialPort::readyRead, this, &SerialPort::newData);
bArray.clear();
fill_serial_ports();
portName = find_stm32_port();
serial->setReadBufferSize(20*1024*1024); // it's a huge buffer.
bArray.reserve(20*1024*1024); // it's a huge buffer.
open_serial_port();
另外,我认为这可能是一个错误是什么错过了一些数据并写入了错误跟踪器。受让人说QSerialPort从来没有丢失数据,我的代码是错误的。我很困惑,我不知道在哪里犯错误。请,你能检查我的其他解决方案吗?错误在哪里?
我的bug跟踪报告(不接受):https://bugreports.qt.io/browse/QTBUG-61233
请问一些示例代码? –
偏离主题,但是......如果你的单线程代码缺少来自端口的数据,那么我不禁感觉到将该代码移动到另一个线程只会使*真实*问题更难调试。 –
如果您要从串口接收大量数据,您可能需要累积从几个readyRead信号接收到的数据。 – Jeka