Qt 【串口通信】跨线程导致问题及解决办法(串口类定义)

说明

工作上遇到需要等待接收对端返回结果,才进行后续处理的情况,可以使用QEventLoop和QTimer::singleShot实现。

部分代码

串口初始化

void serialport::Init(const QSettings& settings)
{
    m_ptrSerialPort = new QSerialPort(this);
    m_ptrSerialPort->setPortName(settings.value("ladserport/portname","COM8").toString());
    m_ptrSerialPort->setBaudRate(settings.value("ladserport/baudrate",921600).toInt());
    m_ptrSerialPort->setParity(QSerialPort::NoParity);
    m_ptrSerialPort->setDataBits(QSerialPort::Data8);
    m_ptrSerialPort->setStopBits(QSerialPort::OneStop);
}

同步接口实现

bool serialport::WriteForResponse(const QByteArray &data, QByteArray &responseMsg)
{
    m_ptrSerialPort->clear();
    bool state = true;

    QEventLoop loop;
    auto async = QObject::connect(m_ptrSerialPort, &QSerialPort::readyRead, [&, this] {
        responseMsg = m_ptrSerialPort->readAll();
        qDebug()<<"responseMsg:"<<responseMsg.toHex();
        emit Finshed();
    });

    m_ptrSerialPort->write(data);
    m_ptrSerialPort->waitForBytesWritten();

    QTimer::singleShot(3000,this,[&](){
       qDebug()<<"singleShot:";
       emit Finshed();
       state=false;
    });
    connect(this,&serialport::Finshed,&loop,&QEventLoop::quit);
    loop.exec();
    QObject::disconnect(async);
    return state;
}
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值