按照使用鼠标输入进行机器人测距(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只是以这种错误的方式行事。
请帮助或指出正确的方向。
答案 0 :(得分:1)
input
子系统提供了几个接口。您正在阅读的是旧版鼠标界面,它提供了/dev/psaux
风格的鼠标设备。 (这些通常创建为/dev/input/mouse*
设备)。
您想要的是鼠标的事件界面,通常创建为/dev/input/event*
。那是提供16字节struct input_event
帧的那个。
您必须调整udev
规则才能选择“事件”设备而不是“鼠标”设备。尝试添加此条件:
KERNEL=="event[0-9]*"