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

时间:2018-04-17 10:56:58

标签: c++ qt serial-port qt5 timing

用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()

但是,这会导致从头开始重建应用程序的大部分内容。还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

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

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