gpt4 book ai didi

c++ - 树莓派无法接收信号,而在 ubuntu 机器上可以,Qt 程序

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:45 25 4
gpt4 key购买 nike

我已经设置了两对 SIGNAL/SLOT 但这些 SIGNAL/SLOT 只能在我的 ubuntu 机器上工作,不能在 pi 3 上工作。

我当时使用带有 raspberry pi 3 的 ubuntu 台式电脑来精益 qt 开发以及一些关于交叉编译的基础知识。经过几天的努力,我终于做了一些在树莓派上运行的例子,看起来一切都很好。于是在Ubuntu上写了一个串口接收程序,在树莓派上编译运行。

项目中只有三个.cpp文件,分别是

main.cpp // main
mainwindow.cpp // Qt widget
uartthread.cpp // thread to process UART reading

main.cpp 非常简单只有几行:

QApplication a(argc, argv);
MainWindow w;

w.show();

return a.exec();

在主窗口中,我设置了一个文本浏览器来显示在 uartthread 上接收到的任何数据,以及 2 个可以停止/恢复接收的按钮。还声明了一个私有(private)变量来存储接收状态。它们的关系可以在mainwindow.h下的声明中说明,如下所示:

private:
Ui::MainWindow *ui;
bool Stop = false; // store the receiving status

QThread *muartThread = new QThread(this); // QThread later for movetothread

uartThread *uartobj = new uartThread(); // uart obj create, later moveto QThread

然后,当按下一个按钮时,将发出一个信号,然后在 uartthread 中进行处理。

 void MainWindow::on_stop_but_clicked()
{
    // stop display
QMutex stopMutex;

stopMutex.lock();
Stop = true;
stopMutex.unlock();

emit stopButton();

qDebug() << "Stop button pressed, Stop = true!" << endl;
}

void MainWindow::on_recei_but_clicked()
{ QMutex stopMutex;

stopMutex.lock();
Stop = false;
stopMutex.unlock();

emit receivButton();

qDebug() << "Receive button pressed, Stop = false!" << endl;
}

这两个信号在 MainWindow 构造函数中注册为:

connect(this,SIGNAL(receivButton()),uartobj,SLOT(receive_press()));
connect(this,SIGNAL(stopButton()),uartobj,SLOT(stop_press()));

此时可以修改uartthread中声明的私有(private)变量。

然后我在 ubuntu 机器下用 raspi-kit 编译这些代码,0 个问题,但是当我运行程序时,它永远不会到达 SLOTS。但是,当我用 ubuntu-kit 编译代码时,每当我按下按钮时,总是可以处理按下信号。

以下是一些附加信息:

Ubuntu: 
Ubuntu 16.04
Desktop Qt 5.6.1 GCC64

pi 3:
Raspbian 8.0
Qt 5.6.2

最佳答案

第一次尝试(失败)

我变了

将信号发送给

 void stopConditionButton(int);

并插入到:

 void stopConditionButton_slot(int);

使用参数来说明按钮条件,现在树莓派可以正常工作。不确定是什么原因造成的问题,但这似乎是一条出路。

经过几个小时的工作,现在这种方法不再有效了......我没有使用任何版本控制工具,所以我会尝试注释掉添加的代码,看看我是否能回到正确的轨道。

第二次尝试(失败)

好的,所以在阅读并重写线程后,使其从链接 https://wiki.qt.io/QThreads_general_usage 看起来正确.此外,connect 方法将返回一个 QMetaObject::Connection,它代表一个句柄,可以将其转换为 bool 以指示连接建立的结果。可悲的是一切都不起作用。线程工作得很好,连接牢固。从@Tyler 那里得到了一些想法,我将专注于编译失败。

关于c++ - 树莓派无法接收信号,而在 ubuntu 机器上可以,Qt 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39074856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com