如何在串行通信中插入间隙?
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之间,串行通信和事件循环之间的一些交互发生了变化。
一个用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之间,串行通信和事件循环之间的一些交互发生了变化。