QSerialPort的waitForReadyRead()函数一直返回false

官方文档翻译(机翻):

[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


 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值