树莓派不能接收信号,而在ubuntu机器上,它可以,Qt程序

Raspberry pi can not receive a SIGNAL while on ubuntu machine it can, Qt program

本文关键字:机器 程序 Qt ubuntu 而在 不能 信号      更新时间:2023-10-16

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

我用一台ubuntu桌面电脑和一个树莓派3来学习qt开发和一些基本的交叉编译。经过几天的努力,我终于在树莓派上运行了一些例子,看起来都很好。所以我在Ubuntu上写了一个UART接收程序,在树莓派上编译并运行。

项目中只有三个.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();

和在主窗口中,我设置了一个文本浏览器来显示在线程上接收到的任何数据,以及两个可以停止/恢复接收的按钮。还声明了一个私有变量来存储接收状态。它们的关系可以在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

然后,当按钮被按下时,将发出一个信号,然后在线程中处理。

 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()));

在这种情况下,可以修改在线程中声明的私有变量。

然后我用raspi-kit在ubuntu机器下编译这些代码,0问题,但是当我运行程序时,它从来没有到达插槽。然而,当我用ubuntu-kit编译代码时,每当我按下按钮时,按钮信号总是可以处理的。

下面是一些附加信息:

Ubuntu: 
Ubuntu 16.04
Desktop Qt 5.6.1 GCC64
pi 3:
Raspbian 8.0
Qt 5.6.2

1日尝试

(失败)

我改变

将信号发送到

 void stopConditionButton(int);

和slot to:

 void stopConditionButton_slot(int);

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

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

<<p> 二尝试/strong>(失败)

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