我的主类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;
}
我已经查看了hyde的评论,并通过一个变通方法解决了这个问题:在退出testConnection
之前,我启动了一个计时器,它会执行一个插槽来读取串行数据,这个解决方案只需很小的延迟就可以工作,并且不会过多地阻塞GUI。