官方文档翻译(机翻):
[virtual]bool QIODevice::waitForBytesWritten(int毫秒)
对于缓冲设备,此函数将等待,直到缓冲写入数据的有效负载已写入设备,并且已发出bytesWritten()信号,或者直到经过毫秒。如果毫秒为-1,则此功能不会超时。对于未缓冲的设备,它会立即返回。
如果数据的有效负载已写入设备,则返回true;否则返回false(即,如果操作超时或发生错误)。
此函数可以在没有事件循环的情况下运行。它在编写非GUI应用程序和在非GUI线程中执行I/O操作时非常有用。
如果从连接到bytesWritten()信号的插槽中调用,则bytesWriten()将不会重新出现。
重新实现此函数以为自定义设备提供阻塞API。默认实现不执行任何操作,并返回false。
警告:从主(GUI)线程调用此函数可能会导致用户界面冻结。
另请参阅waitForReadyRead()。
在实际使用该函数过程中,该函数一直返回false,个人实测了一下在更高Qt版本下就能正常使用
具体原因尚不明确.
但是为了在特定版本下实现串口的等待超时功能,所以自己初略实现一个类似功能函数
//需要头文件
#include <QEventLoop>
#include <QTimer>
//在.h文件中定义等待超时函数和唤醒信号
private:
bool cutomWaiting(const int& msec);
signals:
void customWakeup();
//.cpp文件实现这个函数
bool MainWindow::cutomWaiting(const int &msec)
{
QEventLoop loop;
bool state = true;
QTimer::singleShot(msec,this,[this,&state](){
emit customWakeup();
state=false;
});
connect(this,&MainWindow::customWakeup,&loop,&QEventLoop::quit);
loop.exec();
return state;
}
//使用这个函数:在串口发送数据后调用该函数,调用该函数将进入事件循环并不会阻塞别的信号与槽
//使用该函数返回值判断是否超时
SerialPort->write(sendBuf);
if(cutomWaiting(200))//200表示等待200ms
{
//未超时
}else{
//超时
}
//在串口接收到数据后发送customWakeup()信号,那么cutomWaiting()将立即唤醒返回true
void MainWindow::serialPortRead()
{
recBuf = SerialPort->readAll();
emit customWakeup();
}
//若200ms后没有发送customWakeup()信号,那么cutomWaiting()会在定时时间结束后唤醒返回false