Qt两个串口发送和接收

时间:2018-08-07 21:05:48

标签: c++ qt serial-port qt5

我的主类Foo中有两个MainWindow类的对象,它们使用两个FTDI分支板之间的串行连接来读取和写入串行数据。我已经通过终端检查了此设置,并且可以正常工作。

在我的主类中,我试图将QByteArray从FooA发送到FooB,但是执行receivedtestConnection()为空。我检查了与FooB端口并行连接的FTDI分支的串行连接,并在终端中看到,数据仅在FooA退出testConnection()时发送。如果我再次执行该函数,则received ist填充字符串"Test"。单击按钮时将调用该插槽。

我尝试在FooB发射时从m_serial->readyRead发出信号,并将其连接到MainWindow中的另一个插槽,但是问题仍然存在。

我在这里丢失了什么吗,还是可以解决此问题而不必单击两次以接收消息?

Foo类看起来像这样:

#include <QSerial>

class Foo : public QObject
{
    Q_OBJECT

public:
    Foo();
    ~Foo();

    void writeData(const QByteArray &data);
    QString readData();

private:
    QWidget *m_parent;
    QSerialPort *m_serial;
};    

void DataLink::writeData(const QByteArray &data)
{
    m_serial->clear();
    m_serial->write(data);
}

QString DataLink::readData()
{
    m_serial->waitForReadyRead(1500);
    return QString(m_serial->readAll()).simplified();
}

和MainWindow类看起来像这样:

#include <QMainWindow>
#include <QDebug>
#include "foo.h"

namespace Ui
{
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void testConnection();

private:
    Ui::MainWindow *ui = nullptr;
    Foo *fooA = nullptr;
    Foo *fooB = nullptr;
};

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow), fooA(new Foo()), fooB(new Foo())
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::testConnection()
{
    fooA->writeData("Test");
    QString received = fooB->readData();
    QDebug() << received << endl;
}

1 个答案:

答案 0 :(得分:0)

我已经检查了海德的评论,并通过一种变通方法解决了该问题:在退出testConnection之前,我启动了一个计时器,该计时器执行一个插槽以读取串行数据,并且延迟很小,该解决方案有效并且不会阻塞GUI太多了。