如何在串行通信中插入间隙?

How can I insert gaps into serial communication?

一个用Qt4做的旧应用,通过串口与外部设备通信,我想把它移植到Qt5。

为了同步设备,在数据包之间插入了一个间隙:

(在派生自 QThread 的 class 中的 run() 方法内)

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 派生的 class,而是使用带有 moveToThread()QObject,设置一堆信号和槽,并使用 QTimer 作为时序。

但是,这将导致从头开始重建应用程序的很大一部分。有没有更好的方法?

serial->waitForBytesWritten(); 替换 serial->flush(); 解决了问题。

似乎在Qt4和Qt5之间,串行通信和事件循环之间的一些交互发生了变化。