【问题标题】:Qt two serial ports send and receiveQt 两个串口发送和接收
【发布时间】:2018-08-07 21:05:48
【问题描述】:

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

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

我尝试在m_serial->readyRead 触发时从FooB 发出信号并将其连接到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;
}

【问题讨论】:

  • 不仔细看代码:尝试使用信号和插槽,不要在 GUI 应用程序中使用 waitForXxxxx 方法(至少不是主线程)。
  • 更具体地说,因为您遇到了问题:将 QSerialPort 的每个信号连接到一个插槽并将调试打印添加到所有它们中。这将帮助您了解正在发生的事情,从而使其发挥作用。

标签: c++ qt serial-port qt5


【解决方案1】:

我检查了 hyde 的评论并通过解决方法解决了问题:在退出 testConnection 之前,我启动了一个计时器,它执行一个插槽来读取串行数据,这个解决方案有一点延迟,并且不会阻塞 GUI太多了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多