在waitforreadyread上进行Qt串行通信超时

时间:2017-11-22 09:27:26

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

我尝试让串行通信工作,但在等待响应时却很费劲。逻辑应该是发送数据,等待响应,获得响应然后重复。

为了加速我的代码并阻止它阻止代码的其他独立部分,我在一个单独的线程中运行串行通信。

问题在于发送功能,我总是得到一个" Timeout"消息而不是"成功"消息。

serial.h

#ifndef SERIAL_H
#define SERIAL_H

#include <QThread>
#include <QDebug>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QStringList>

class Serial : public QThread
{
    Q_OBJECT
public:
    Serial();
    bool send(QString text);  
    bool connectSerial();
    void disconnectSerial();

signals:
    void dataReceived(QByteArray receivedData);

protected:
    void run();

private slots:
    void onGetData();

private:
    void readAngles();

    QSerialPort qsp;
    QSerialPortInfo qspi;

    QByteArray receivedData;
};

#endif // SERIAL_H

serial.cpp

#include "serial.h"

Serial::Serial()
{    
    connect(&qsp, SIGNAL(readyRead()), this, SLOT(onGetData()));
}

bool Serial::send(QString text)
{
    if (qsp.isWritable()) {
        QByteArray buffer = text.toLatin1();

        if (buffer.size() != qsp.write(buffer))
            qDebug() << "Send does not work";

        qsp.flush();
        if(!qsp.waitForReadyRead(2500)) {
            qDebug() << "Timeout";
        } else {
            qDebug() << "Success";
        }

        return true;
    } else {
        return false;
    }
}

void Serial::onGetData()
{
    qDebug() << "onGetData called";
    qDebug() << qsp.readAll();
}

bool Serial::connectSerial(int port)
{
    qDebug() << qspi.availablePorts().count();
    for(int i=0; i<qspi.availablePorts().count(); i++) {
        qDebug() << qspi.availablePorts().at(i).description();
    }

    qsp.setPort(qspi.availablePorts().at(port));
    qsp.setBaudRate(QSerialPort::Baud9600);
    qsp.setDataBits(QSerialPort::Data7);
    qsp.setFlowControl(QSerialPort::NoFlowControl);
    qsp.setParity(QSerialPort::NoParity);
    qsp.setStopBits(QSerialPort::OneStop);

    return qsp.open(QIODevice::ReadWrite);
}

/**
 * @brief Disconnecting from serial port.
 */
void Serial::disconnectSerial()
{
    if (qsp.isOpen()) {
        qsp.close();
    }
}

void Serial::readAngles()
{
    send("012345");
}

0 个答案:

没有答案