第十八篇,Linux系统IO应用 您所在的位置:网站首页 input的应用 第十八篇,Linux系统IO应用

第十八篇,Linux系统IO应用

2023-06-08 04:55| 来源: 网络整理| 查看: 265

一、linux系统IO应用实例。   -->  触摸屏 1、在linux下,一切都是文件。 连触摸屏也是文件,所以触摸屏也有对应的设备文件名。 设备文件名:/dev/input/event0

2、关于触摸屏专业术语。 1)事件。 当一些外接控制设备(鼠标、键盘、WIFI、触摸屏、按键)接入到嵌入式平台(GEC6818)时,这些外接设备的状态发生了改变(鼠标的左键被按下了、触摸屏被滑动了一下、有人连接到wifi模块上),这个动作过程称之为事件。

例如:小明按下鼠标左键并松开了,请问一共发生了几个事件? 2次,按下算一次,松开算一次。

2)输入子系统 当事件发生的时候,就是由输入子系统来计算这个事件中所产生的所有值。

例如:小明点击触摸屏后,小明并不知道自己点击的位置的坐标是多少,但是小明点击了触摸屏,就相当于产生了一个事件,这个事件系统是知道的,当这个事件产生的时候,输入子系统就会去计算小明点击的位置的坐标是多少,然后计算完之后,就会把这个结果保存到系统中。

二、既然我们触摸屏坐标结果是保存在event0这个文件中,那么能不能写一个程序,将这些结果数据读取出来? 1、访问触摸屏设备文件。 2、读取该文件上的数据。 3、将读取出来的数据打印出来。 4、关闭文件。

#include   //printf #include #include #include   //open #include  //read close

int main(int argc,char *argv[]) {     //1. 访问触摸屏设备     int fd = open("/dev/input/event0",O_RDONLY);     if(fd < 0)         printf("open event0 error!\n");          //2. 读取设备上的数据     char buf[50] = {0};     while(1)     {         read(fd,buf,sizeof(buf));              //3. 打印读取出来的数据         printf("buf = %s\n",buf);         }          //4. 关闭文件     close(fd);          return 0; }

运行结果: 当触摸屏幕时,结果都是乱码。

三、究竟触摸屏数据类型是什么? 如果想知道从文件event0读取出来的数据是什么类型的,首先必须要先知道输入子系统计算完结果之后,这个结果是以什么形式保存到event0中。

1、在linux下,是如何来描述一个事件?   --> 以结构体形式来描述一个事件。 该结构体已经定义好了,是被定义在一个输入事件头文件中:   /usr/include/linux/input.h

//事件结构体  --> 专门用于描述一个事件的 struct input_event {     struct timeval time;  //发生事件的时间     __u16 type;           //事件类型       -->  鼠标发生事件/     键盘发生事件    /触摸屏发生事件      __u16 code;           //事件的编码     --> 左键/右键/滚轮       A键/B键        x轴/y轴/压力     __s32 value;          //事件的值       --> 专门用于描述状态 };

总结:每当发生一次事件、输入子系统都会返回一个结构体给我们,该结构体就是来描述刚才发生的事件。

2、既然知道输入子系统放进去的是结构体,那么修改代码为:

#include   //printf #include #include #include   //open #include  //read close #include

int main(int argc,char *argv[]) {     //1. 访问触摸屏设备     int fd = open("/dev/input/event0",O_RDONLY);     if(fd < 0)         printf("open event0 error!\n");          //2. 读取设备上的数据     struct input_event buf;     while(1)     {         read(fd,&buf,sizeof(buf));              //3. 打印读取出来的数据         printf("buf.type = %d\n",buf.type);         printf("buf.code = %d\n",buf.code);         printf("buf.value = %d\n",buf.value);                  printf("-------------------------------\n");     }          //4. 关闭文件     close(fd);          return 0; }

运行结果: [root@GEC6818 /]#./ts buf.type = 3          --> 触摸屏坐标事件      buf.code = 0          --> x轴坐标 buf.value = 505       --> x轴坐标的值 ------------------------------- buf.type = 3          --> 触摸屏坐标事件    buf.code = 1          --> y轴坐标 buf.value = 215       --> y轴坐标的值 ------------------------------- buf.type = 1          --> 按键事件     buf.code = 330        --> 触摸屏压力                             buf.value = 1         --> 按下 ------------------------------- buf.type = 1          --> 按键事件 buf.code = 330        --> 触摸屏压力  buf.value = 0         --> 松开 -------------------------------

分析结果: 这些结果分析都是在#include "input-event-codes.h"这个头文件中。 分析input-event-codes.h头文件内容:

/*  * Event types  */

#define EV_KEY      --> 按键事件(键盘/触摸屏压力)        0x01 #define EV_REL      --> 相对位移事件(鼠标)                0x02 #define EV_ABS      --> 绝对位移事件(触摸屏坐标)        0x03

#define BTN_TOUCH   --> 触摸屏压力        0x14a   #define ABS_X        --> x轴        0x00 #define ABS_Y        --> y轴        0x01    四、使用触摸屏知识点,来写一个简单的应用。

    例子: 写一个程序,当我们的手点击触摸屏的松手时,就打印"your hand leave lcd!"

#include   //printf #include #include #include   //open #include  //read close #include  //for ts

int main(int argc,char *argv[]) {     //1. 打开触摸屏设备文件     int fd = open("/dev/input/event0",O_RDONLY);     if(fd < 0)         printf("open event0 error!\n");          struct input_event buf;     while(1)     {         //2. 将文件的数据读取到结构体中         read(fd,&buf,sizeof(buf));                  //会发生很多的事件,但是只有松手事件我才要。         //3. 判断这些数据         //如果以下三个条件都成立,说明发生了松手事件         if(buf.type == EV_KEY && buf.code == BTN_TOUCH && buf.value == 0)         {             //4. 做出反应             printf("your hand leave lcd!\n");         }     }          //5. 关闭文件。     close(fd);          return 0; }

    练习1: 写一个程序,当我们的手在屏幕上滑动的时候,就把手所在的位置的x轴坐标打印出来。

    练习2: 写一个程序,当我们的手在屏幕上滑动的时候,就把手所在的位置的y轴坐标打印出来。

    练习3: 写一个程序,当我们的手在屏幕上滑动的时候,就把手所在的位置的坐标打印出来。

(100 , 200) (100 , 201) (100 , 202) .... ....

     帮我查两个东西:      1、原点在哪里?   --> 左上方      2、x轴坐标最大值是多少?  y轴坐标最大值是多少?         1024                600

    练习4: 写一个程序,实现当手点击屏幕左边区域松手时,就打印一次"left"                当手点击屏幕右边区域松手时,就打印一次"right"    --> 是一次,不是很多次。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有