用Qt4制作的旧应用程序通过串口与外部设备通信,我想将其移植到Qt5。
要同步设备,会在数据包之间插入间隙:
(在从run()
派生的类中的QThread
方法内)
QSerialPort *serial;
// setting up the serial port
// ....
for (...)
{
serial->write(data, length);
serial->flush();
this->msleep(pause);
}
其中pause
比写作所需的时间长,以保证差距。
这一切在Qt4下运行良好,但它在Qt5上无效。
serial->flush();
导致整个通信在第一个数据包之后挂起(并且永远不会恢复),所以我删除了它。
睡觉没有效果。 this->msleep(pause);
和QThread::msleep(pause);
都不起作用,数据包只是粘在一起。这很可能是由于删除了刷新引起的,只有在缓冲区中收集到足够的字节后才会发送实际数据。
我想一个可行的解决方案是不再使用从QThread
派生的类,而是使用带有QObject
的{{1}},设置一堆信号和插槽,并使用时间为moveToThread()
。
但是,这会导致从头开始重建应用程序的大部分内容。还有更好的方法吗?
答案 0 :(得分:0)
用serial->flush();
替换serial->waitForBytesWritten();
解决了这个问题。
似乎串行通信和事件循环之间的某些交互在Qt4和Qt5之间发生了变化。