检测Qt5中GPIO引脚的变化

Detecting GPIO pin change in Qt5

本文关键字:变化 引脚 GPIO Qt5 检测      更新时间:2023-10-16

我对树莓派还是个新手。

我的问题的实质如下:

我有一个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(&notifier, &QSocketNotifier::activated, this, &MyClass::interruptFired);