使用libgpiod库中的事件方式监测多个输入事件

 Linux下要同时检测多个GPIO输入的方法有很多,这里我使用libgpiod库中的API实现多个GPIO输入检测,可以达到类似STM32利用外部中断实现输入事件检测的效果,示例代码如下所示:

/* 示例使用的libgpiod库版本为V1.2.1 */
//示例功能是通过libgpiod库捕获GPIO输入事件#include <stdbool.h>
#include <stdio.h>
#include "gpiod.h"/* GPIO组路径 */
#define GPIO_CHIP_PATH "/dev/gpiochip0"/* GPIO组 */
struct gpiod_chip *Test_Gpio_Chip;/* 电源切换信号输入 */
struct gpiod_line *Gpio_Line_In_Switch;
#define LINE_IN_SWITCH_ID   113  /* PD17 *//* 脉冲信号输入 */
struct gpiod_line *Gpio_Line_In_PPS;
#define LINE_IN_PPS_ID   115  /* PD19 *//*** 配置GPIO输入* * 本函数用于配置GPIO线脚为输入模式,并设置其触发事件。需要指定GPIO芯片、引脚ID号、触发事件以及GPIO线脚的客户端名称。* * @param chip 指向GPIO芯片的指针。* @param line 指向GPIO线脚的指针的地址,函数执行成功后,会在这里返回配置好的线脚指针。* @param line_id 要配置的GPIO线脚的ID。* @param edge 触发事件的类型,0表示下降沿触发,1表示上升沿触发,2表示同时触发。* @param consumer 指定使用这个GPIO线脚的客户端名称。* @return 成功返回0,否则返回错误码。* @note 触发事件类型为0表示下降沿触发,1表示上升沿触发,2表示同时触发。*/
int gpio_input_config(struct gpiod_chip* chip, struct gpiod_line** line, int line_id, int edge, const char* consumer)
{struct gpiod_line* tmp_line;int ret;if (!chip || !consumer || !line){return -1;}tmp_line = gpiod_chip_get_line(chip, line_id);if (!tmp_line) {return -2;}if(edge == 0){ret = gpiod_line_request_falling_edge_events(tmp_line, consumer);}else if(edge == 1){ret = gpiod_line_request_rising_edge_events(tmp_line, consumer);}else{ret = gpiod_line_request_both_edges_events(tmp_line, consumer);}if (ret < 0) {gpiod_line_release(tmp_line);return -3;}*line = tmp_line;return ret;
}/*** GPIO清理函数* * 本函数用于释放GPIO资源,包括释放GPIO线脚和关闭GPIO芯片。*/
void gpio_cleanup(void) 
{if(Gpio_Line_In_PPS){gpiod_line_release(Gpio_Line_In_PPS);}if(Gpio_Line_In_Switch){gpiod_line_release(Gpio_Line_In_Switch);}if(Gnss_Gpio_Chip){gpiod_chip_close(Gnss_Gpio_Chip);}
}/*** GPIO初始化函数* * 本函数用于初始化GPIO,将GPIO配置为输入。* * @return 成功返回0,否则返回-1。*/
int gpio_init(void) 
{int init_sta = 0;int ret;/* 打开芯片GPIO组 */Test_Gpio_Chip = gpiod_chip_open(GPIO_CHIP_PATH);if (!Test_Gpio_Chip ) {return -1;}/* PPS引脚输入配置 */ret = gpio_input_config(Test_Gpio_Chip, &Gpio_Line_In_PPS, LINE_IN_PPS_ID, 0, "pps");if (ret == 0) {init_sta++;}else{printf ("gpio %d input config failed: %d\n", LINE_IN_PPS_ID, ret);}/* 电源切换信号输入配置 */ret = gpio_input_config(Test_Gpio_Chip, &Gpio_Line_In_Switch, LINE_IN_SWITCH_ID, 0, "switch");if (ret == 0) {init_sta++;}else{printf ("gpio %d input config failed: %d\n", LINE_IN_SWITCH_ID, ret);}    /* 如果配置失败,则关闭芯片并返回错误 */if (init_sta == 0){if(Test_Gpio_Chip){gpiod_chip_close(Test_Gpio_Chip);}return -1;}return 0;
}/*** GPIO输入事件处理线程* * 本函数用于处理GPIO输入事件,通过调用gpiod_line_event_wait和gpiod_line_event_read函数来获取事件。* * @param arg 线程参数,这里没有使用。*/
void* gpio_input_event_thread(void* arg)
{struct gpiod_line_bulk gpiod_line_bulk, event_bulk;struct gpiod_line_event event;int ret;gpiod_line_bulk_add(&gpiod_line_bulk, Gpio_Line_In_PPS);gpiod_line_bulk_add(&gpiod_line_bulk, Gpio_Line_In_Switch);    while(1){/* 无限阻塞,直到输入事件到来 */ret = gpiod_line_event_wait_bulk(&gpiod_line_bulk, NULL, &event_bulk);if (ret < 0){printf("gpiod line event wait error\n");}else if(ret == 0){printf("gpiod line event wait timeout\n");}else{/* 解析检测到的事件 */for(unsigned int i=0; i<event_bulk.num_lines; i++){if(gpiod_line_event_read(event_bulk.lines[i], &event) == 0){printf("line %d event happen\n", gpiod_line_offset(event_bulk.lines[i]));/* 还可以根据event中的内容判断当前检测到的事件是上升沿还是下降沿*/}                  }}}
}int main(void) 
{if (gpio_init() != 0) {printf("gpio init failed\n");return 1;}gpio_input_event_thread(NULL);gpio_cleanup();return 0;
}

运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/22902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022.9.26DAY678

课程学习&#xff1a;《数据处理技术》讲了“数据查询”的语法格式&#xff0c;语法格式也算是简单&#xff0c;就是没能跟之前的内容联系起来&#xff0c;之前的内容没有及时回顾。 高等数学&#xff1a;“ 函数的概念”&#xff0c;讲了函数的概念&#xff0c;反函数&#…

make_ext4fs:not found

报错信息&#xff1a; 解决&#xff1a; sudo apt-get install android-tools-fsutils sudo apt-get install android-sdk-libsparse-utils sudo apt-get install android-sdk-ext4-utils

跟TED演讲学英文:Let your garden grow wild by Rebecca McMackin

Let your garden grow wild Link: https://www.ted.com/talks/rebecca_mcmackin_let_your_garden_grow_wild Speaker: Rebecca McMackin Date: October 2023 文章目录 Let your garden grow wildIntroductionVocabularySummaryTranscriptAfterword Introduction Many garden…

怎么等比例缩小图片尺寸?这四种方法肯定可以帮到你!

怎么等比例缩小图片尺寸&#xff1f;在当今日常生活中&#xff0c;图片文件是我们不可或缺的一部分&#xff0c;它们以各种形式出现&#xff0c;从社交媒体上的照片到工作文档中的插图&#xff0c;然而&#xff0c;随之而来的问题是&#xff0c;有时这些图片文件的尺寸过大&…

Threejs墙体挖洞做门或窗

在使用Threejs代码构建的展厅中&#xff0c;需要在一面墙中间挖个洞作为门或窗户&#xff0c;效果如下&#xff1a; 引入ThreeBSP.js <script src"plugins/three/ThreeBSP.js"></script> 创建 // 1 定义墙面var cubeGeometry new THREE.BoxGeometry(1…

使用 LiteGraph.js 构建可视化工作流图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 LiteGraph.js 构建可视化工作流图 应用场景介绍 LiteGraph.js 是一个轻量级的开源 JavaScript 库&#xff0c;用于构建可视化工作流图。它广泛应用于游戏开发、数据可视化、交互式叙事等领域。 代码基本…

2024会声会影激活码免费注册码大揭秘!

在当今数字化时代&#xff0c;视频编辑已经成为了许多人日常生活和工作中不可或缺的一部分。无论是制作短视频、Vlog还是专业影视剪辑&#xff0c;一款优秀的视频编辑软件都能让我们事半功倍。而市面上众多的视频编辑软件中&#xff0c;会声会影无疑是备受瞩目的一款。本文将为…

【全开源】知识库文档系统(ThinkPHP+FastAdmin)

&#x1f4da;知识库文档系统&#xff1a;解锁知识的无限可能 一款基于ThinkPHPFastAdmin开发的知识库文档系统&#xff0c;可用于企业工作流程的文档管理&#xff0c;结构化记录沉淀高价值信息&#xff0c;形成完整的知识体系&#xff0c;能够轻松提升知识的流转和传播效率&a…

收银系统源码-千呼新零售2.0【合作案例】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

英伟达唯一指定液冷散热供应商维谛技术的股价还有巨大的上涨空间

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 在“全球AI风向标”英伟达带来的超额回报影响下&#xff0c;以及华尔街持续看好英伟达后续走势的带动下&#xff0c;美股已经掀起了一场AI“淘金热”。猛兽财经将在本文中详细介绍一下我们之前就非常看好的一家在全球AI产业…

vue的elementUI的el-tree的选择

有一棵树型的数据,需要实现:在外部加一个 全选和不全选的按钮,去全部勾选树结构里面每一项的选框。 当点击勾选全选的时候,树的每一项都勾选; 当取消全选的时候,树的每一项都不勾选; 当选树的其中一项时,全选按钮是半选状态; 实现效果如下: <template><…

动态规划——浅谈dp如何入门,以及入门题目(值得收藏,持续更新)

前言 动态规划如何入门?如果你问我怎么精通,那我只能告诉你我也不知道,但你要问我怎么入门,那我就可以和你说道说道了. 我并没有能力也不想说你看完就会了,我只是想给大家开个头,你只要知道怎么写了怎么去思考了,你就可以通过刷题来强化思维了,能走多远就看各位的造化了! 动…

从头搭hadoop集群--分布式hadoop集群搭建

模板虚拟机安装配置见博文&#xff1a;https://blog.csdn.net/weixin_66158110/article/details/139236148 配置文件信息如下&#xff1a;https://pan.baidu.com/s/1074eD5aNVugEPcjwVvi9jA?pwdl1xq&#xff08;提取码&#xff1a;l1xq&#xff09; hadoop版本&#xff1a;h…

“论软件架构风格”必过范文,突击2024软考高项论文

论文真题 软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。体系结构风格定义一个系统家族&#xff0c;即一个体系结构定义一个词汇表和一纽约束。词汇表中包含一些构件和连接件类型&#xff0c;而这组约束指出系统是如何将这些构件和连接件组合起来的。体系…

慧天卓特:东南亚基于多源遥感的干旱、土壤水分及洪灾、植被指数、火灾监测和空气质量监测分析

概述 亚洲的东南部地理位置具有特殊的意义&#xff0c;是亚洲纬度最低的地区&#xff0c;也处于亚澳之间的过渡地带&#xff0c;属热带季风气候&#xff0c;森林等自然资源丰富&#xff0c;人口稠密&#xff0c;东南亚和南亚地区面临农业生产、环境保护和经济发展的多重挑战&a…

短视频系列内容生产技能提升 沈阳短视频剪辑培训

优势&#xff1a;一、短视频系列化内容的优势 ①可持续性强 某一条视频效果很好(几十万点赞)时&#xff0c;按照相同格式继续输出非常容易成功: √不需要设计脚本&#xff1b; √不需要重新定制。 √稳定性强&#xff0c; ②节约时间成本和制作成本 举例对标账号&#xf…

随身WiFi十大热门品牌优缺点分析!哪个品牌的随身wifi更值得买?随身wifi推荐测评!

格行随身wifi 【品牌特点】&#xff1a;服务好&#xff0c;性价比高&#xff0c;随身WiFi行业的“海底捞” 【优点】&#xff1a;专注物联网行业15年&#xff0c;产品和服务双驱动&#xff0c;综合实力和客户口碑领先 【缺点】&#xff1a;产品相对聚焦&#xff0c;产品类型…

小程序中实现自定义头部导航组件

在页面中实现自定义头部导航的组件&#xff0c;如果仅是单个页面中需要自定义可在页面的json文件中配置"navigationStyle": “custom”&#xff0c;如果是项目中所有页面都想使用自定义的组件&#xff0c;可在app.json的window中全局配置"navigationStyle"…

VUE3 学习笔记(12):对比Vuex与Pinia状态管理的基本理解

在组件传值中&#xff0c;当嵌套关系越来越复杂的时候必然会将混乱&#xff0c;是否可以把一些值存在一个公共位置&#xff0c;无须传值直接调用呢&#xff1f;VUEX应运而生&#xff0c;但是从VUE3开始对VUEX的支持就不那么高了&#xff0c;官方推荐使用Pinia。 Vuex配置 ST1:…

深度剖析可视化大屏的技术架构

在当今信息化时代&#xff0c;可视化大屏作为一种重要的信息展示方式&#xff0c;广泛应用于监控指挥中心、数据分析展示等领域。其技术架构对于保障大屏系统的稳定性和性能至关重要。本文将深入探讨可视化大屏的技术架构&#xff0c;包括硬件架构、软件架构和数据架构等方面&a…