Python - 如何使用 ioctl 或 spidev 从设备读取输入?

2024-01-17

我有一个提供它的供应商提供了一些 C 代码来监听按钮按下,该代码使用ioctl。该设备具有 SSD1289 控制器。

按钮不需要额外的引脚,可以通过 SPI 读取其状态。

这就是我想要的,读取按下了哪个按钮。

我试图在 Python 中为我自己的应用程序复制此脚本,但 _IOR 和 ioctl 要求让我失望。

#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#define SSD1289_GET_KEYS _IOR('keys', 1, unsigned char *)

void get_keys(int fd)
{
    unsigned char keys;
    if (ioctl(fd, SSD1289_GET_KEYS, &keys) == -1)
    {
        perror("_apps ioctl get");
    }
    else
    {
        printf("Keys : %2x\n", keys);
    }
}

int main(int argc, char *argv[])
{
    char *file_name = "/dev/fb1";
    int fd;
    fd = open(file_name, O_RDWR);
    if (fd == -1)
    {
        perror("_apps open");
        return 2;
    }

    while(1)
    get_keys(fd);

    printf("Ioctl Number: (int)%d  (hex)%x\n", SSD1289_GET_KEYS, SSD1289_GET_KEYS);
    close (fd);
    return 0;
}

现在我知道Python有一个ioctl http://docs.python.org/2/library/fcntl.html模块,在某个时候我应该调用

file = open("/dev/fb1")
buf = array.array('h', [0])
fcntl.ioctl(file,  ????, buf, 1)

我不明白是什么SSD1289_GET_KEYS应该是。我如何得到这个以及它是什么_IOR?

另外,如果这是错误的方法,了解这一点也会有帮助。有一些图书馆,例如spidev http://tightdev.net/SpiDev_Doc.pdf据说是用于 SPI 的,但我不知道用它来读什么。


@alexis 在下面提供了一些有用的步骤,这让我明白了这一点:

import fcntl
import array
file = open("/dev/fb1")
buf = array.array('h', [0])
fcntl.ioctl(file, -444763391, buf, 1)

现在,如果我将上面的内容保持在循环中,按下按钮会更改 buf 的值。


你走在正确的轨道上,你只需要找出要使用的常数。你的供应商的程序实际上会以十进制和十六进制打印出来——如果你只是编辑的话main()并移动printf无尽之上的线while loop:

printf("Ioctl Number: (int)%d  (hex)%x\n", SSD1289_GET_KEYS, SSD1289_GET_KEYS);

while(1)
    get_keys(fd);

解释:

_IOR是一个定义在的宏sys/ioctl.h。其定义如下:

#define _IOC(inout,group,num,len) \
    (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num))
#define _IO(g,n)    _IOC(IOC_VOID,  (g), (n), 0)
#define _IOR(g,n,t) _IOC(IOC_OUT,   (g), (n), sizeof(t))
#define _IOW(g,n,t) _IOC(IOC_IN,    (g), (n), sizeof(t))

我已经包含了相关的上下文行。您可以看到该宏构造了一个位掩码(我们可以从名称中看出)处理读取操作。但您的目标是找出所需的位掩码,这可以轻松完成:通过运行供应商的 C 程序cc -E,您将在应用预处理器命令后看到源代码。追踪定义get_keys(首先会有很多头文件,所以它将位于输出的最后),然后取出第二个参数。

结果可能取决于系统,因此您应该亲自尝试一下。在我的盒子上,它显示为

((__uint32_t)0x40000000 | ((sizeof(unsigned char *) & 0x1fff) << 16) | ((('keys')) << 8) | ((1)))

不急于将其翻译成Python,我在开头添加了以下几行main():

printf("%d", ((__uint32_t)0x40000000 | ((sizeof(unsigned char *) & 0x1fff) << 16) | 
               ((('keys')) << 8) | ((1))));
exit(0);

我运行了程序,它给了我输出1702458113, which may成为您需要的值。它应该与十进制输出相同printf命令已经存在(但隐藏在无尽的下面)while环形)。但你自己检查一下,如果你把你的硬件搞坏了或者什么的,别怪我!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python - 如何使用 ioctl 或 spidev 从设备读取输入? 的相关文章

  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 如何将带有自定义分配器的 std::vector 传递给需要带有 std::allocator 的函数?

    我正在使用外部库 pcl 因此我需要一个不会更改现有函数原型的解决方案 我正在使用的一个函数生成一个std vector
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • 有没有办法拉伸整个显示图像以适应给定的分辨率?

    我最近一直在使用pygame制作游戏 遇到了一个小问题 基本上 我希望能够将屏幕上的整个图像 我已经传输到它的所有内容 拉伸到用户将窗口大小调整到的分辨率 我在 pygame 和堆栈溢出的文档中搜索了很多 但我似乎找不到答案 这可能吗 我的
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • 在 anaconda 环境下运行 qsub

    我有一个程序 通常在 Linux 的 conda 环境中运行 因为我用它来管理我的库 指令如下 source activate my environment python hello world py 我怎样才能跑你好世界 py在与 PBS
  • 避免“散点/点/蜂群”图中的数据点重叠

    使用绘制点图时matplotlib 我想偏移重叠的数据点以使它们全部可见 例如 如果我有 CategoryA 0 0 3 0 5 CategoryB 5 10 5 5 10 我想要每一个CategoryA 0 数据点并排设置 而不是彼此重叠
  • 如何在supervisord中设置组?

    因此 我正在设置 Supervisord 并尝试控制多个进程 并且一切正常 现在我想设置一个组 以便我可以启动 停止不同的进程集 而不是全部或全无 这是我的配置文件的片段 group tapjoy programs tapjoy game1
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • 正则表达式 - 匹配不包含字符串的模式

    我对正则表达式很陌生 并且一直在寻找方法来做到这一点 但没有成功 给定一个字符串 我想删除以 abc 开头 以 abc 结尾且中间不包含 abc 的任何模式 如果我做 abc abc abc 它将匹配以 b 开头 以 abc 结尾并且中间包

随机推荐

  • 从 str 和 Enum 继承有哪些注意事项

    使用从两者继承的类有哪些注意事项 如果有 str and Enum 这被列为解决以下问题的可能方法将 Enum 成员序列化为 JSON https stackoverflow com questions 24481852 serialisi
  • 有没有办法判断iphone是否处于漫游状态?

    我正在开发一个 iPhone 应用程序 并且非常想确定该设备是否正在漫游 以便我可以智能地避免用户在脱离家庭网络时花费昂贵的连接费用 我正在编写的应用程序适用于越狱手机 但如果可能的话 我更愿意使用标准 SDK 这是我已经发现的 1 苹果S
  • 处理CursorLoader异常

    我有一个实现 LoaderManager 并使用 CursorLoader 的片段 没什么花哨的 我想捕获查询期间抛出的异常 但我不知道如何捕获 有什么帮助吗 谢谢 我尝试继承并实现一个侦听器 然后尝试继承并实现一个回调 就我而言 最简单且
  • sinon 存根不替换函数

    我正在尝试使用 sinon 存根来替换可能需要很长时间的函数 但是当我运行测试时 测试代码似乎没有使用 sinon 存根 这是我要测试的代码 function takeTooLong return returnSomething funct
  • ORM UniqueConstraint,空值重复

    我有一个对 3 个字段具有唯一约束的实体 2 个字段不可为空 第三个字段可为空 我的问题是 当第三个字段为空时 唯一约束不起作用 因此我可以在数据库中包含一些重复的值 例如 5 1 null 5 1 null 为我 5 1 null 是一个
  • Drupal 6 到 7 迁移

    我们有一个用 drupal 6 编写的 drupal 站点 我们知道我们必须为 drupal 7 重写它 大部分 但最重要的部分是迁移数据 CCK migrate 只能迁移大约 90 的田地 我正在寻找一种干净的方法将 drupal 6 数
  • 如何在 Angular 的构造函数中使用 @Inject 文本测试组件

    Angular 6 我在组件的构造函数中声明了一些注入的变量 但是当我运行时 我不知道如何在单元测试文件中配置注入的值ng test它给出了以下错误 错误 StaticInjectorError DynamicTestModule 标题 S
  • 如何更改代码中 Xaml 资源中的颜色定义 (UWP)

    UWP 我有许多带有来自 App xaml 的颜色绑定的网格 主页 xaml
  • 错误:未找到:'dart:ui' import 'dart:ui' show lerpDouble;

    块引用 错误 未找到 dart ui 导入 dart ui 显示 lerpDouble 使用 F5 来运行代码 而不是 运行代码 按钮 右上角的三角形图标 因为 vscode 将运行您当前正在使用的文件而不是整个项目
  • 2 个日期值之间的随机时间和日期

    我正在尝试编写一个 php 脚本 或代码行 来回显两个日期之间的随机时间和日期 例如 2012 12 24 13 03 这将是我选择的日期2012年10月1日和2013年1月1日之间 有什么想法如何最好地做到这一点 提前致谢 简单 只需选择
  • 如何在 Angular/TypeScript 中组合两个 URLSearchParam?

    我有两个URLSearchParams物体 我想将这两个物体结合起来制作第三个 例如 我可以有 let params1 new URLSearchParams params1 set page one params1 set size hu
  • 将 Logstash json 消息分解为字段

    它有一个日志文件 用于存储带有时间戳和 json 消息的事件 例如 时间戳 foo 12 bar 13 我想将 json 部分中的键 foo 和 bar 分解为 Logstash 输出中的字段 我知道我可以将 Logstash 文件过滤器中
  • VS Code Python 中的“启动 Jupyter 服务器”

    我已经安装了带有 Python 扩展的 VS Code 我已经使用 Anaconda 发行版创建了一些 conda 环境 当我以交互模式运行任何 python 代码时 在下面的部分中显示 正在启动 jupyter 服务器 并且代码继续运行
  • 使用一个查询从 mysql 表创建带有 rowspan 的 html 表?

    我有个问题 假设我有一个具有以下结构的关系表 ClientInvoices id id client id invoice 1 1 1 2 1 2 3 2 3 4 3 4 5 1 5 您可以看到客户 1 有 3 张发票 每个客户可以有多个发
  • 在 SQLite.cs 中找不到类型或命名空间“Sqlite”

    我有一个使用 SQLite 的 Windows Phone 8 应用程序 该应用程序具有许多数据库功能 并包括一个 sqlite 数据库文件 该文件在运行应用程序时被复制到本地文件夹并进行访问 所有这些都没有问题 直到我第一次切换到发布版本
  • 无法使用带有 python 的 selenium 通过 sendkeys 将文件上传到 iframe 内的按钮元素

    环境 Python Selenium 我正在尝试将本地文件上传到上传文件按钮 首先 我尝试查看是否可以找到该元素并单击该按钮 我通过使用成功了 driver switch to frame upload frame driver find
  • 在 C++ 中声明基于函数参数的本地数组是合法的

    我从一本书中读到 以下 C 代码不应编译 void f int n int m int a n b n m 因为数组的大小不是在编译时确定的 但我尝试了一下 发现无论是全局函数还是成员函数 使用g 都可以编译成功 这在最近的 C 实现中是合
  • 如何从Java代码生成UML图(尤其是序列图)?

    如何从现有的 Java 代码生成 UML 图 尤其是序列图 ObjectAid UML 资源管理器 http www objectaid com home 是我用过的 这很容易已安装 https www objectaid com inst
  • C# 线程池限制线程数

    好吧 我已经对该网站进行了公平的搜索 并阅读了许多有关该主题的帖子 我发现这个问题 C 中的简单线程池代码 https stackoverflow com questions 435668 code for a simple thread
  • Python - 如何使用 ioctl 或 spidev 从设备读取输入?

    我有一个提供它的供应商提供了一些 C 代码来监听按钮按下 该代码使用ioctl 该设备具有 SSD1289 控制器 按钮不需要额外的引脚 可以通过 SPI 读取其状态 这就是我想要的 读取按下了哪个按钮 我试图在 Python 中为我自己的