python epoll

需要用python实现中断的功能,所以用epoll监听gpio文件的变化。写个demo测试一下。

参考:

http://www.cnblogs.com/coser/archive/2012/01/06/2315216.html

http://www.cnblogs.com/helloworldtoyou/p/5532271.html

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import select

import gpio
# 申请gpio
def gpioExport(gpioIndex):
    with open('/sys/class/gpio/export', 'wb') as f:
        f.write(str(gpioIndex).encode())
# 设置gpio为输入
def setInput(gpioIndex):
    with open('/sys/class/gpio/gpio%d/direction' % gpioIndex, 'wb') as f:
        f.write('in'.encode())
# 设置gpio触发方式
def setEdge(gpioIndex, edge):
    with open('/sys/class/gpio/gpio%d/edge' % gpioIndex, 'wb') as f:
        f.write(edge.encode())

gpioExport(15)
gpioExport(36)

setInput(15)
setInput(36)
# 上升沿,下降沿触发
setEdge(15, 'both')
setEdge(36, 'both')
# 这里和C语言中返回值不同。C语言返回值是个int,表示文件描述符的值,而python中需要通过fileno()函数来获取。
# 读取值
f1 = open('/sys/class/gpio/gpio%d/value' % 15, 'r+')
f2 = open('/sys/class/gpio/gpio%d/value' % 36, 'r+')

print ('fd1: %d' % f1.fileno())
print ('fd2: %d' % f2.fileno())

epoll = select.epoll()

# 注册
epoll.register(f1, select.EPOLLERR | select.EPOLLPRI)
epoll.register(f2, select.EPOLLERR | select.EPOLLPRI)

# 进入主循环,监听gpio的电平变化,
while True:
    events = epoll.poll()	# 没有设置时间,一直阻塞
    for fileno, event in events:
		# 有数据需要读取
        if event & select.EPOLLPRI:
	    # f1发生变化
            if fileno == f1.fileno():
                print ('f1: %s' % f1.read().strip('\n'))
                # 文件读取完,将文件指针偏移到文件开头,方便下次读取
                f1.seek(0, 0)
	    # f2发生变化
            elif fileno == f2.fileno():
                print ('f2: %s' % f2.read().strip('\n'))
                f2.seek(0, 0)
		# 出现错误
        if event & select.EPOLLERR:
                pass

Tony Liu

2017-6-7, Shenzhen

posted @   SuperTao1024  阅读(879)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示