Linux之解析鼠标input事件数据(有BUG,已经解决)

简介:

在这里我说两句废话,在写代码的过程中遇到问题一定要去仔细分析问题所在,遇到问题是好事,解决问题说明你在成长。写这篇文章的原因是我发现网上对鼠标数据解析类的文章非常少,还有个现象是很多网友喜欢大量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;
}




目录
相关文章
|
18天前
|
Linux 编译器 开发者
Linux设备树解析:桥接硬件与操作系统的关键架构
在探索Linux的庞大和复杂世界时🌌,我们经常会遇到许多关键概念和工具🛠️,它们使得Linux成为了一个强大和灵活的操作系统💪。其中,"设备树"(Device Tree)是一个不可或缺的部分🌲,尤其是在嵌入式系统🖥️和多平台硬件支持方面🔌。让我们深入了解Linux设备树是什么,它的起源,以及为什么Linux需要它🌳。
Linux设备树解析:桥接硬件与操作系统的关键架构
|
14天前
|
存储 JSON JavaScript
「Python系列」Python JSON数据解析
在Python中解析JSON数据通常使用`json`模块。`json`模块提供了将JSON格式的数据转换为Python对象(如列表、字典等)以及将Python对象转换为JSON格式的数据的方法。
29 0
|
14天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
20 3
|
21天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
23天前
|
存储 缓存 监控
深入解析linux内存指标:快速定位系统内存问题的有效技巧与实用方法(free、top、ps、vmstat、cachestat、cachetop、sar、swap、动态内存、cgroops、oom)
深入解析linux内存指标:快速定位系统内存问题的有效技巧与实用方法(free、top、ps、vmstat、cachestat、cachetop、sar、swap、动态内存、cgroops、oom)
|
27天前
|
网络协议 Linux
Linux自建DNS
Linux自建DNS
11 0
|
27天前
|
网络协议 Linux 网络安全
Linux服务器DNS服务器配置实现bind的正向解释和反向解释
Linux服务器DNS服务器配置实现bind的正向解释和反向解释
17 0
|
5天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
2天前
|
监控 Linux Windows
50个必知的Linux命令技巧,你都掌握了吗?(下)
50个必知的Linux命令技巧,你都掌握了吗?(下)