Linux   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Linux输入设备读取ioctl(EVIOCGKEY())与读取(input_event)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我的所有代码都基于 linuxjournal.com上的一篇文章 here is the article I based my code on 我正在编写一个嵌入式应用程序,我正在尝试从键盘上读取按键. 这是我正在使用的代码 uint8_t key_b[KEY_MAX/8 + 1]; memset(key_b, 0, sizeof(key_b)); ioctl(fd, EVIOCGKEY(size
我的所有代码都基于 linuxjournal.com上的一篇文章
here is the article I based my code on

我正在编写一个嵌入式应用程序,我正在尝试从键盘上读取按键.
这是我正在使用的代码

uint8_t key_b[KEY_MAX/8 + 1];
memset(key_b,sizeof(key_b));
ioctl(fd,EVIOCGKEY(sizeof(key_b)),key_b);

for (yalv = 0; yalv < KEY_MAX; yalv++) {
    if (test_bit(yalv,key_b)) {
        /* the bit is set in the key state */
        printf("  Key 0x%02x ",yalv);
        switch ( yalv)
        {
        case KEY_RESERVED :
            printf(" (Reserved)\n");
            break;
        case KEY_ESC :
            printf(" (EscapE)\n");
            break;
        /* other keys / buttons not shown */
        case BTN_STYLUS2 :
            printf(" (2nd Stylus Button )\n");
            break;
        case KEY_1:
            printf("The key 1 was pressed");
            break;
        case KEY_2:
            printf("The key 2 was pressed");
            break;
        case KEY_A:
            printf("The key A was pressed");
            break;
        default:
            printf(" (UnkNown key)\n");
        }
    }
}

在大多数情况下,这个代码可以工作,除非我按下“a”.

根据input.h,KEY_A被设置为值30.但是当我按下键盘上的’a’时,它返回值102而不是30.我已经测试了键盘上的其他键,看起来像键1-6返回KEY_1,KEY_2等的预期值,但之后返回的值不正确.

我试过直接从/ dev / input / eventX文件中读取偶数.并且事件中返回的代码是预期的.

size_t rb;
/* the events (up to 64 at oncE) */
struct input_event ev[64];
int yalv;
int keybrdToCapture;

    if((keybrdToCapture = open(EVENT2,O_RDONLY)) == -1) {
    perror("opening device");
    exit(EXIT_FAILURE);
    printf("L2\n");
}

rb=read(keybrdToCapture,ev,sizeof(struct input_event)*64);

for (yalv = 0; yalv < (int) (rb / sizeof(struct input_event)); yalv++)
{
    printf("yalv is %d\n",yalv);
    if (EV_KEY == ev[yalv].typE)
        printf("type %d code %d value %d\n",ev[yalv].type,ev[yalv].code,ev[yalv].value);
}

当我按下’a’键时,上面的代码给出了这个打印输出.
输入1代码30值1

此时您可能想知道为什么我不会简单地读取输入事件来读取键盘输入.这是因为read()是一个阻塞函数.然ioctl()没有阻止.

如果有人能帮我弄清楚为什么EVIOCGKEY()返回错误的键值,我将非常感激.谢谢!

解决方法

好的,我弄清楚问题是什么.

我的test_bit()宏写得不正确.
基本上,key_b []逐位表示键的状态.意味着如果按下KEY_A,则位30将被设置为1.在这种情况下,位30将在key_b [3]中显示为值0x40.

这里有一些关于每个键如何映射到key_b []的例子.

> KEY_1 = 2在key_b中表示为 – > key_b [0] = 0x04;> KEY_2 = 3在key_b中表示为 – > key_b [0] = 0x08;> KEY_3 = 4在key_b中表示为 – > key_b [0] = 0x10;> KEY_4 = 5在key_b中表示为 – > key_b [0] = 0x20;> KEY_5 = 6在key_b中表示为 – > key_b [0] = 0x40;> KEY_6 = 7在key_b中表示为 – > key_b [0] = 0x80;> KEY_7 = 8在key_b中表示为 – > key_b [1] = 0x01;> KEY_8 = 9在key_b中表示为 – > key_b [1] = 0x02;> KEY_9 = 10在key_b中表示为 – > key_b [2] = 0x04;> KEY_0 = 11在key_b中表示为 – > key_b [3] = 0x08;

大佬总结

以上是大佬教程为你收集整理的Linux输入设备读取ioctl(EVIOCGKEY())与读取(input_event)全部内容,希望文章能够帮你解决Linux输入设备读取ioctl(EVIOCGKEY())与读取(input_event)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。