树莓派不能接收信号,而在ubuntu机器上,它可以,Qt程序
Raspberry pi can not receive a SIGNAL while on ubuntu machine it can, Qt program
我设置了两对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那里得到了一些想法,我将专注于编译失败
- 我写了一个C++程序来模拟Enigma机器.我没有得到输出
- 在 64 位机器上构建 32 位 Qt 应用程序
- 我的程序在Windows机器上崩溃了,但在Linux上运行良好
- 在机器异常之后重新执行程序
- 如何从另一台Ubuntu机器中运行Ubuntu中的C 程序
- 通过 occi 连接 oracle db 的 MFC 应用程序.但它在 64 位机器中运行时0xC000007b错误
- 是什么使C++程序仅是 64 位或受机器限制
- 在64位Windows7机器上编译时,C中的Flex会产生不支持的16位应用程序
- 我的程序在不同的机器上给出不同的输出
- 在本地机器上进行应力测试C++程序
- 在运行时存储程序的机器指令的位置
- 将消息 JavaFX gui 交换到同一台机器上的C++应用程序
- 程序在一台机器上编译,但不在另一台机器上编译
- 在VMWare机器上编译的程序在亚马逊服务器上运行时会因非法指令而崩溃
- QtSql应用程序不能在已部署的机器上工作
- 如何编译一个程序在64位机器上工作
- 将应用程序从本地Linux机器移动到Linux服务器
- 修复某些机器上c++程序中字体扭曲的大系统字体
- 如何在Linux/Windows机器的Android操作系统上运行c++程序
- 程序在多核机器上的多个实例