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/ ...
随机推荐
- 深入理解JVM1
1 Java技术与Java虚拟机 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言.Java类文件格式.Java虚拟机和Java应用程 ...
- INSPIRED启示录 读书笔记 - 第41章 产品经理的反省清单
十大问题 1.产品能吸引目标消费者的关注吗? 2.产品的设计是否人性化,是否易于操作? 3.产品能在竞争中取胜吗?即使是面对未来风云变化的市场,依旧有取胜的把握吗? 4.我了解目标用户吗?产品(不是理 ...
- Java远程执行Shell命令
1. Jar包:ganymed-ssh2-build210.jar 2. 步骤: a) 连接: Connection conn = new Connection(ipAddr); conn.conne ...
- seajs 入门
最近想搞搞JS模块化, 读到了园子里的一篇好文: http://www.cnblogs.com/lvdabao/p/js-modules-develop.html 看里面讲seajs不错, 于是想学 ...
- 【转载】如何简单地理解Python中的if __name__ == '__main__'
原帖:https://blog.csdn.net/yjk13703623757/article/details/77918633 通俗的理解__name__ == '__main__':假如你叫小明. ...
- Complex social network Partition for Balanced Subnetworks---Hao Lan Zhang,Jiming Liu,Chunyu Feng,Chaoyi Pang,Tongliang Li,Jing He阅读
摘要:Abstract—Complex social network analysis methods have been applied extensively in various domains ...
- linux 基本命令___0001
参考公众号:生信媛 参考链接:每天一个linux命令(61):wget命令 参考链接:<sort帮你排序>-linux命令五分钟系列之二十六 参考链接:每天一个linux命令(34):du ...
- android.intent.category.LAUNCHER和android.intent.action.MAIN
一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢? 有些程序可能需要显示在程序列表里,有些不需要.怎么定义呢? android. ...
- jqgrid的scroll参数的使用
scroll参数会影响addJSONData(data)方法的使用 存在scroll参数,addJSONData方法会往表格中追加数据: 不存在scroll参数时,addJSONData方法会覆盖表格 ...
- java基础(3)-多线程(1)
java多线程 进程与线程 进程:指一个正在执行的应用程序.每个进程执行都有一个执行顺序,该顺序称为一个执行路径或一个控制单元(进程是资源分配的最小单位).一个进程包含1~n个线程 线程:指进程中某个 ...