我对树莓派还是个新手。
我的问题的实质如下:
我有一个GPIO引脚的变化,必须被监视(连续轮询),看看它是否改变。如果它改变了,我必须使用Loader在我的Qt5项目中加载一个新的QML文件。我知道如何做装载机部分,考虑到它相当简单。我需要一种方法来轮询GPIO引脚并被通知更改。
我读到QSocketNotifier类可能有帮助。但老实说,我不知道该怎么做。
对找出如何做到这一点提供的任何帮助是赞赏的。谢谢你:)
编辑:我正在为基于树莓派的系统构建一种主菜单,用于在GUI上选择不同的选项,运行在Debian上。它就像一个机顶盒。与屏幕上基于GUI的按钮等效,它应该能够从连接到GPIO引脚的外部按钮获取基于硬件的中断,从而导致加载新页面/开始新活动。
如果我理解正确的话,代码的c++部分必须捕获这个引脚更改,并将其传递给QML部分。我需要能够做到这一点
你对环境和其他需要做的事情只字未提。如果没有其他任务也没有o/s,也许这就是你想要的?:
int last_state = -1; // impossible state so change is noticed the first time
for (;;) // do forever
{
int state = get_gpio (THE_EVENT);
if (state == last_state)
{
sleep (100);
continue;
}
do_loader_stuff();
last_state = state;
}
可以将引脚配置为中断驱动。它的工作方式是,在您执行配置之后,您现在可以在表示引脚的文件上执行select()
,并且当引脚改变状态时,select()
将返回。
下面是sysfs gpio接口的文档:https://www.kernel.org/doc/Documentation/gpio/sysfs.txt
下面是引脚19的设置:
QFile exportFile("/sys/class/gpio/gpio19/export");
exportFile.open(QIODevice::WriteOnly);
exportFile.write("19");
QFile directionFile("/sys/class/gpio/gpio19/direction");
directionFile.open(QIODevice::WriteOnly);
directionFile.write("in");
QFile edgeFile("/sys/class/gpio/gpio19/edge");
edgeFile.open(QIODevice::WriteOnly);
edgeFile.write("body");
现在,不用直接使用select()
,可以使用QSocketNotifier
。
QFile file("/sys/class/gpio/gpio19/value");
QSocketNotifier notifier(file.handle(), QSocketNotifier::Read);
connect(¬ifier, &QSocketNotifier::activated, this, &MyClass::interruptFired);