来自mouseevent的fread返回3个字节​​而不是16个,sizeof(input_event)

时间:2011-01-21 20:55:36

标签: linux mouse mouseevent

按照使用鼠标输入进行机器人测距(http://web.me.com/haroldsoh/tutorials/technical-skills/using-optical-mice-for-othe-2/)的教程,我创建了一个udev规则,将鼠标识别为自定义输入设备,我称之为/ dev / odoml&的/ dev / odomr。

/etc/udev/rules.d/90-odom.rules:

  

SUBSYSTEMS ==“输入”ATTRS {phys} ==“usb-0000:00:1d.2-1 / input0”,NAME =“odoml”

usb端口标识鼠标。现在我尝试在c:

中读取鼠标输入
  

int f = open(“dev / odoml”,O_RDONLY);
  input_event ev;
  int read_byes =(f,& ev,sizeof(input_event));

我的问题是大多数时候我得到的是不完整的3而不是预期的16字节的input_event。 拔掉鼠标似乎改变了一些事情:鼠标每10次按预期工作。插入鼠标并且read()正确读取16个字节后,鼠标在程序执行之间保持工作状态。如果鼠标不起作用,它将无法开始工作,直到我重新插入它并且运气好 - 大约10个。我看不出它如何失败的规律性。

每次都会正确打开文件。 cat / dev / odoml在鼠标停止工作时显示 less 数据。使用O_DIRECT打开设备失败。 O_ASYNC,O_NDELAY没有帮助 - 它是-1或3.我在4只不同的老鼠身上检查了它,其中3只是以这种错误的方式行事。

请帮助或指出正确的方向。

1 个答案:

答案 0 :(得分:1)

input子系统提供了几个接口。您正在阅读的是旧版鼠标界面,它提供了/dev/psaux风格的鼠标设备。 (这些通常创建为/dev/input/mouse*设备)。

您想要的是鼠标的事件界面,通常创建为/dev/input/event*。那是提供16字节struct input_event帧的那个。

您必须调整udev规则才能选择“事件”设备而不是“鼠标”设备。尝试添加此条件:

KERNEL=="event[0-9]*"