在这里我说两句废话,在写代码的过程中遇到问题一定要去仔细分析问题所在,遇到问题是好事,解决问题说明你在成长。写这篇文章的原因是我发现网上对鼠标数据解析类的文章非常少,还有个现象是很多网友喜欢大量copy别人的博文,然后不加验证就发表出来,别人错误的代码你也跟着错误,至少得自己验证过后是正确的在发表吧。
上代码之前补充几点知识,也是我在解析鼠标数据时候犯下的错误:
当我们写好鼠标驱动程序后,我们测试利用的是cat /dev/event0 或者hexdump /dev/event0
这是Input输入事件的上报事件的格式
struct timeval {
__kernel_time_ttv_sec;
/* seconds */
__kernel_suseconds_ttv_usec;
/* microseconds */
};
/*
* The event structure itself
*/
struct input_event {
struct timeval time; /* 固定格式,一定要理解了 */
__u16 type;
__u16 code;
__s32 value;
};
这是hexdump /dev/event0 后的数据:(非常重要的知识点)
秒 微秒 类 code value
0000000 0bb2 0000 0e48 000c 0001 0026 0001 0000
0000010 0bb2 0000 0e54 000c 0000 0000 0000 0000
0000020 0bb2 0000 5815 000e 0001 0026 0000 0000
0000030 0bb2 0000 581f 000e 0000 0000 0000 0000
/* 第一个字符串代表系统时间,无影响,第二和第三个字符串代表秒,第四和第五个字符串代表微妙,依次是类,类下面的那种事件,最后32位是具体值,从上面结构体我们是可以看出来的,这里要注意我们读取数据时候第一个字符串是不会读取的,我就犯了第一个错误,第二个错误我们读取数据应该从右往左读数,这满足于小端模式*/
现在开始上代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
/*
*mouse_test
*/
struct input_event1 { /* 时间没有用到,我们读取时间不是这个的范围 */
unsigned short type;
unsigned short code;
unsigned int value;
};
struct input_event1 input_mouse;
/* 字符串的格式是:
秒 微秒 类 code value
0000000 0bb2 0000 0e48 000c 0001 0026 0001 0000
这里要注意前面那一个字符串是系统时间,这里我们没有读取,我们只需要读取类,code,value
*/
int main(int argc, char **argv)
{
int fd;
unsigned char key_val[16];
fd = open("/dev/event0", O_RDWR);
if (fd < 0)
{
printf("can't open /dev/event0\n");
}
while(1)
{
printf(" this is bug \n"); /* 这里遇到一个BUG,添加这条语句,下面的printf才会执行,不添加就不会执行 ,折腾两个小时才发现这个BUG,望大牛指点一下为什么,小弟感激不尽。*/
read(fd, key_val,16); /* 把数据全部读取到key_val数组中 */
input_mouse.type=(key_val[9]<<8 | key_val[8]);
/* 处理数据,把数据放在上面定义的结构体中 */
input_mouse.code=((key_val[11]<<8)|key_val[10]);
input_mouse.value=((key_val[13]<<24)|(key_val[12]<<16)|(key_val[15]<<8)|key_val[14]);
printf("%04x ",input_mouse.type);
printf("%04x ",input_mouse.code);
printf("%04x ",input_mouse.value);
}
return 0;
}