2011-01-21 79 views
0

按照关于使用鼠标输入进行机器人测距的教程(http://web.me.com/haroldsoh/tutorials/technical-skills/using-optical-mice-for-othe-2/),我创建了一个udev规则来将鼠标标识为自定义输入设备,并将其称为/ dev/odoml &/dev/odomr。fread from mouseevent返回3字节,而不是16,sizeof(input_event)

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

SUBSYSTEMS == “输入” ATTRS {的PHY} ==“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显示减去数据。使用O_DIRECT打开设备失败。 O_ASYNC,O_NDELAY没有帮助 - 它是-1或者3.我检查了4个不同的老鼠,其中3个以这种错误的方式行事。

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

回答

1

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

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

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

KERNEL=="event[0-9]*" 
相关问题