QSerialPort线程化处理

QSerialPort天生异步,与所有继承自QIODevice的类一样,然而串口操作在实际使用过程中,通常都是一写一读,如果在写完之后一直等待读取,无疑浪费了QSerialPort的异步特性,通过使用QEventLoop可以很好地解决这个问题。

代码如下:

QEventLoop loop;
pSerialPort->write((char*)aucSend, datalen + 5);
//监听readyRead,如果监听到readyRead,立刻退出此段loop
QObject::connect(pSerialPort, &QSerialPort::readyRead, &loop, &QEventLoop::quit);
//1秒后,立刻退出此段loop
QTimer::singleShot(1000, &loop, SLOT(quit()));
//loop进行事件循环,此时主线程可以去处理其他事情
loop.exec();

//查看串口是否可读,即判断loop是监听到readyRead退出还是1秒超时退出
if(false == pSerialPort->isReadable()) {
	m_LastError = "(Encoder)Failed to read data from COM buffer.";
	return false;
}