一个完整的使用GPIO捕捉中断的程序:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
#include<poll.h>

#define MSG(args...) printf(args) 

//函数声明
static int gpio_export(int pin);
static int gpio_unexport(int pin);
static int gpio_direction(int pin, int dir);
static int gpio_write(int pin, int value);
static int gpio_read(int pin);
static int gpio_edge(int pin, int edge);

static int gpio_export(int pin)
{
    ];
    int len;
    int fd;  

    fd = open("/sys/class/gpio/export", O_WRONLY);
    )
    {
        MSG("Failed to open export for writing!\n");
        );
    }  

    len = snprintf(buffer, sizeof(buffer), "%d", pin);
    printf("%s,%d,%d\n",buffer,sizeof(buffer),len);
    )
    {
        MSG("Failed to export gpio!");
        ;
    }  

    close(fd);
    ;
}
static int gpio_unexport(int pin)
{
    ];
    int len;
    int fd;  

    fd = open("/sys/class/gpio/unexport", O_WRONLY);
    )
    {
        MSG("Failed to open unexport for writing!\n");
        ;
    }  

    len = snprintf(buffer, sizeof(buffer), "%d", pin);
    )
    {
        MSG("Failed to unexport gpio!");
        ;
    }  

    close(fd);
    ;
}
//dir: 0-->IN, 1-->OUT
static int gpio_direction(int pin, int dir)
{
    static const char dir_str[] = "in\0out";
    ];
    int fd;  

    snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/direction", pin);
    fd = open(path, O_WRONLY);
    )
    {
        MSG("Failed to open gpio direction for writing!\n");
        ;
    }  

     ?  : ], dir ==  ?  : ) < )
    {
        MSG("Failed to set direction!\n");
        ;
    }  

    close(fd);
    ;
}
//value: 0-->LOW, 1-->HIGH
static int gpio_write(int pin, int value)
{
    ";
    ];
    int fd;  

    snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin);
    fd = open(path, O_WRONLY);
    )
    {
        MSG("Failed to open gpio value for writing!\n");
        ;
    }  

     ?  : ], ) < )
    {
        MSG("Failed to write value!\n");
        ;
    }  

    close(fd);
    ;
}
static int gpio_read(int pin)
{
    ];
    ];
    int fd;  

    snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin);
    fd = open(path, O_RDONLY);
    )
    {
        MSG("Failed to open gpio value for reading!\n");
        ;
    }  

    ) < )
    {
        MSG("Failed to read value!\n");
        ;
    }  

    close(fd);
    return (atoi(value_str));
}
// none表示引脚为输入,不是中断引脚
// rising表示引脚为中断输入,上升沿触发
// falling表示引脚为中断输入,下降沿触发
// both表示引脚为中断输入,边沿触发
// 0-->none, 1-->rising, 2-->falling, 3-->both
static int gpio_edge(int pin, int edge)
{
const char dir_str[] = "none\0rising\0falling\0both";
char ptr;
];
    int fd;
switch(edge)
{
    :
        ptr = ;
        break;
    :
        ptr = ;
        break;
    :
        ptr = ;
        break;
    :
        ptr = ;
        break;
    default:
        ptr = ;
} 

    snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/edge", pin);
    fd = open(path, O_WRONLY);
    )
    {
        MSG("Failed to open gpio edge for writing!\n");
        ;
    }  

    )
    {
        MSG("Failed to set edge!\n");
        ;
    }  

    close(fd);
    ;
}
//GPIO1_17
int main()
{
    int gpio_fd, ret;
    ];
    ];
    unsigned ;

    gpio_unexport();
    gpio_unexport();

    //p8_12 init
    gpio_export();
    gpio_direction(, );//output out
    gpio_write(, );

    //p8_11 init
    gpio_export();
    gpio_direction(, );//input in
    gpio_edge(,);
    gpio_fd = open("/sys/class/gpio/gpio45/value",O_RDONLY);
    )
    {
        MSG("Failed to open value!\n");
        ;
    }
    fds[].fd = gpio_fd;
    fds[].events  = POLLPRI;

    )
    {
        ret = read(gpio_fd,buff,);
         )
        MSG("read\n");

        ret = poll(fds,,);
         )
        MSG("poll\n");
        ].revents & POLLPRI)
        {
            ret = lseek(gpio_fd,,SEEK_SET);
             )
            MSG("lseek\n");

            //gpio_write(44, cnt++%2);
            printf("**********************************\n");
        }
        usleep();
    }
    ;
}

GPIO编程2:使用GPIO监听中断完整程序的更多相关文章

  1. Python网络编程(epoll内核监听,多任务多进程)

    OJBK    接着昨天的说 select模块内的epoll函数还没说  说完epoll和本地套接字套接字基本就没了 今天主要是多进程   理论性东西比较多  主要是理解         epoll ...

  2. Android 编程下短信监听在小米手机中失效的解决办法

    相信很多人写的短信监听应用在小米手机上是拦截不到短信的,这是因为小米对短信的处置权优先分给了系统.我们可以在短信的[设置]→[高级设置]→[系统短信优先]中发现短信的优先处理权默认是分给系统的,只要关 ...

  3. 使用GPIO监听中断

    #include<stdlib.h> #include<stdio.h> #include<string.h> #include<unistd.h> # ...

  4. (原创)用Receiver和SystemService监听网络状态,注册Receiver的两种方式

    android中网络编程不可避免地要监听网络状态,wifi或者3G以及以太网,并根据当前状态做出相应决策. 在MyReceiver类中的onReceive方法中获得系统服务 ConnectivityM ...

  5. Java并发编程的艺术(六)——中断、安全停止线程

    什么是中断 Java的一种机制,用于一个线程去暂停另一个线程的运行.就是一个正在运行的线程被其他线程给打断,停止运行挂起了. 我觉得,在Java中,这种中断机制只是一种方便程序员编写进程间的通信罢了. ...

  6. Python自动化编程-树莓派GPIO编程(二)

    树莓派我们编程一般都直接用高效的python,针对于GPIO编程,python也是有这一方面的库的,这里最有名也是最常用的就是RPI.GPIO了.这个库是专门为树莓派GPIO编程所设计的,利用它你可以 ...

  7. 4.JAVA之GUI编程事件监听机制

    事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件. ...

  8. Python黑客编程基础3网络数据监听和过滤

    网络数据监听和过滤 课程的实验环境如下: •      操作系统:kali Linux 2.0 •      编程工具:Wing IDE •      Python版本:2.7.9 •      涉及 ...

  9. 树莓派的GPIO编程

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 树莓派除了提供常见的网口和USB接口 ,还提供了一组GPIO(General Purpose Input/ ...

随机推荐

  1. R/Bioconductor包的下载和安装,升级

    R包:基本包(自动加载)和推荐包(安装R时也会下载,但需要手动加载),拓展包(其他包,手动加载). 安装好的包将被放在一个指定的目录下.这个目录被称为库(Library).当需要使用到某一个包的时候, ...

  2. 20145239杜文超《网络攻防》- MSF基础应用

    20145239杜文超<网络攻防>- MSF基础应用 基础问题回答 1.用自己的话解释什么是exploit,payload,encode? exploit:实现攻击行为的主体,但没有载荷只 ...

  3. 20145230《java学习笔记》第七周学习总结

    20145230 <Java程序设计>第7周学习总结 教材学习内容 Lambda语法概览 我们在许多地方都会有按字符串长度排序的需求,如果在同一个方法内,我们可以使用一个byName局部变 ...

  4. vRO 添加已有磁盘到VM

    在vRO实现将已有虚拟机磁盘添加到另外的虚拟机上,以为vRA发布Oracle/SQL集群做准备: // 脚本需要两个输入 vm_obj和diskPathSystem.log("Attempt ...

  5. java基础(3)-多线程(1)

    java多线程 进程与线程 进程:指一个正在执行的应用程序.每个进程执行都有一个执行顺序,该顺序称为一个执行路径或一个控制单元(进程是资源分配的最小单位).一个进程包含1~n个线程 线程:指进程中某个 ...

  6. DataX-HDFS(读写)

    DataX操作HDFS 读取HDFS 1 快速介绍 HdfsReader提供了读取分布式文件系统数据存储的能力.在底层实现上,HdfsReader获取分布式文件系统上文件的数据,并转换为DataX传输 ...

  7. Spark性能优化指南--基础篇

    前言 开发调优 调优概述 原则一:避免创建重复的RDD 原则二:尽可能复用同一个RDD 原则三:对多次使用的RDD进行持久化 原则四:尽量避免使用shuffle类算子 原则五:使用map-side预聚 ...

  8. 到底EJB是什么

    到底EJB是什么   到底EJB是什么?被口口相传的神神秘秘的,百度一番,总觉得没有讲清楚的,仍觉得一头雾水.百度了很久,也从网络的文章的只言片语中,渐渐有了头绪. 用通俗话说,EJB就是:" ...

  9. 什么是CDN 域名预热

    通常大家理解的预热功能是,缓存预热.将需要预热的资源推送到CDN边缘节点,用户访问时将不需要再回源站,可以直接命中缓存.这样可以加快资源的首次访问,同时缓解突增回源流量给源站造成的压力.这里说的是域名 ...

  10. skynet中的各种锁

    最近读skynet c语言部分的源码,发现有好多锁的使用和gcc提供的一些原子操作.看到这些东西,对于我这个newbee来说实在有些hold不住.但为了了解并进一步掌握,还是决定好好分析一下.不足之处 ...