linux应用层读写event,Linux输入设备读取ioctl(EVIOCGKEY())与读取(input_event)

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

这是我正在使用的代码

uint8_t key_b[KEY_MAX/8 + 1];

memset(key_b, 0, 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;

标签:c-3,linux,keyboard,keyboard-events,ioctl

来源: https://codeday.me/bug/20190629/1322186.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值