2011-01-21 52 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]*" 
相關問題