关于read函数读取的问题


#include "own.h"

int main()
{
    int tsfd;
    //定义输入子系统提供的结构体变量来存放坐标
    struct input_event myevent;
    
    //打开触摸屏的驱动
    tsfd=open("/dev/input/event0",O_RDWR);
    if(tsfd==-1)
    {
        perror("打开触摸屏失败了!\n");
        return -1;
    }
    
    while(1) //循环读取坐标
    {
        //读取触摸屏的坐标值
        read(tsfd,&myevent,sizeof(myevent));
        //判断事件类型--》触摸事件
        if(myevent.type==EV_ABS) //是触摸事件
        {
            //进一步判断读取是x坐标,还是y坐标
            if(myevent.code==ABS_X) //是x坐标
                printf("读取的x坐标是: %d\n",myevent.value);
            if(myevent.code==ABS_Y) //是y坐标
                printf("读取的y坐标是: %d\n",myevent.value);    
        }
    }
    
    
    //关闭触摸屏
    close(tsfd);
    return 0;
}

在这段read函数读取触摸屏坐标时,如果我把while循环去掉,我触摸一下触摸屏,只能打印x坐标信息而不打印y的坐标信息,而在while循环中我同样触摸一次,却能够打印x和y坐标信息,不太明白,同样开始读取了一个完整结构体大小的信息,那么读取进结构体的信息是x或y坐标还是两者都有,如果两者都有,那么没有循环的代码不是也应该能打印两个坐标信息,如果只有其一,那么在循环中的代码也应该只打印了其中之一。

我的分析:点一次触发的event不止一个,你只读一次当然只能读到一个。
这个不难分析,myevent.code==ABS_X和myevent.code==ABS_Y这两个条件显然是互斥的,一次肯定只能打印一个。而加个while就能打印两个,说明肯定是触发了两个不同的event。
如果一个event里可以一次包含两个信息,那肯定不会用myevent.code==ABS_X这种方式去判断。
我也不知道这个是什么设备,不过把一次点击变成两个event,一次x,一次y,感觉不是很好的设计。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^