GPIO编程2:使用GPIO监听中断完整程序
一个完整的使用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监听中断完整程序的更多相关文章
- Python网络编程(epoll内核监听,多任务多进程)
OJBK 接着昨天的说 select模块内的epoll函数还没说 说完epoll和本地套接字套接字基本就没了 今天主要是多进程 理论性东西比较多 主要是理解 epoll ...
- Android 编程下短信监听在小米手机中失效的解决办法
相信很多人写的短信监听应用在小米手机上是拦截不到短信的,这是因为小米对短信的处置权优先分给了系统.我们可以在短信的[设置]→[高级设置]→[系统短信优先]中发现短信的优先处理权默认是分给系统的,只要关 ...
- 使用GPIO监听中断
#include<stdlib.h> #include<stdio.h> #include<string.h> #include<unistd.h> # ...
- (原创)用Receiver和SystemService监听网络状态,注册Receiver的两种方式
android中网络编程不可避免地要监听网络状态,wifi或者3G以及以太网,并根据当前状态做出相应决策. 在MyReceiver类中的onReceive方法中获得系统服务 ConnectivityM ...
- Java并发编程的艺术(六)——中断、安全停止线程
什么是中断 Java的一种机制,用于一个线程去暂停另一个线程的运行.就是一个正在运行的线程被其他线程给打断,停止运行挂起了. 我觉得,在Java中,这种中断机制只是一种方便程序员编写进程间的通信罢了. ...
- Python自动化编程-树莓派GPIO编程(二)
树莓派我们编程一般都直接用高效的python,针对于GPIO编程,python也是有这一方面的库的,这里最有名也是最常用的就是RPI.GPIO了.这个库是专门为树莓派GPIO编程所设计的,利用它你可以 ...
- 4.JAVA之GUI编程事件监听机制
事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件. ...
- Python黑客编程基础3网络数据监听和过滤
网络数据监听和过滤 课程的实验环境如下: • 操作系统:kali Linux 2.0 • 编程工具:Wing IDE • Python版本:2.7.9 • 涉及 ...
- 树莓派的GPIO编程
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 树莓派除了提供常见的网口和USB接口 ,还提供了一组GPIO(General Purpose Input/ ...
随机推荐
- 主攻ASP.NET MVC4.0之重生:Jquery Mobile 表单元素
相关代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...
- console、JSON兼容问题
console在ie8上面竟然有兼容问题,JSON.stringify()在ie10下竟然会报错,再页面上引用一个json2.js能解决此问题.
- 20145230《java学习笔记》第七周学习总结
20145230 <Java程序设计>第7周学习总结 教材学习内容 Lambda语法概览 我们在许多地方都会有按字符串长度排序的需求,如果在同一个方法内,我们可以使用一个byName局部变 ...
- Qt Ping
QProcess对象可以直接执行cmd的命令,但是ping操作是会阻塞的,所以需要在子线程里ping QProcess *tempCmd = new QProcess(); tempCmd->s ...
- 多校hdu-5775 Bubble sort(线段树)
题意根据题目中给的冒泡排序写出每个元素交换过程中该元素位置左右最大差距: 分析:因为题目中冒泡程序从后向前遍历的,假设第i个元素左边有k个比i小的数,那么i必定会向右移动k位,我们用k1记住i+k,用 ...
- 算法总结之 在数组中找到出现次数 > N/K的数
题目1 给定一个整型数组arr, 打印其中出现次数大于一半的数, 如果没有这样的数,打印提示信息 进阶 给定一个整型数组arr, 再给定一个整数K, 打印所有出现次数大于 N/K的数,如果没有这样的 ...
- QT 事件处理 KeyPressEvent 和 定时器时间 Timer
1. 按键事件响应, 两种方法,一种直接处理Event,过滤出KeyPress,另一种直接处理KeyPressEvent. bool Dialog::event(QEvent *e) { if( e- ...
- SDNLAB技术分享(四):利用ODL下发流表创建VxLAN网络
邓晓涛,当前就职于江苏省未来网络创新研究院,是CDN团队的一名研发人员,主要从事SDN相关的研发相关工作.曾就职于三星电子于先行解决方案研发组任高级工程师.思科系统于云协作应用技术部(CCATG)任工 ...
- uva 10168 哥德巴赫猜想
https://vjudge.net/problem/UVA-10168 给出一个整数n,问是否能将它化为四个素数相加的形式,如果可以的话就输出这四个数.显然n<8时是不可能的.对于大于等于8得 ...
- 利用Pelican搭建个人博客
博客基于win7系统,python2.7和pelican. 1.安装工具 安装virtualenv pip install virtualenv 下载make,或者make移动至任一目录,并将路径写入 ...