当前位置: 首页 > news >正文

【Liux下6818开发板(ARM)】触摸屏

  • (꒪ꇴ꒪ ),hello我是祐言
  • 博客主页:C语言基础,Linux基础,软件配置领域博主🌍
  • 快上🚘,一起学习!
  • 送给读者的一句鸡汤🤔:
  • 集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

        在正式学习触摸屏之前,我们先来了解一下事件类型及其常见动作,虽然可能看起来一大堆,但是常用的并不多,希望耐心学完,方便后续的学习和使用。

一、事件类型


        在Linux输入子系统中,事件类型(Event Types)用于标识输入设备生成的不同类型的事件。每个事件都有一个特定的类型代码,用于表示该事件属于哪种类型。在Linux内核中,输入子系统定义了几种常见的事件类型,其中一些主要的事件类型包括:

        1. `EV_SYN`(0x00):表示事件同步。当多个事件组合在一起时,会在它们之间插入一个`EV_SYN`事件,用于同步事件的处理。

        2. `EV_KEY`(0x01):表示键盘事件。用于表示按键的按下和释放操作,每个按键都有一个特定的键码(key code)。

        3. `EV_REL`(0x02):表示相对事件。用于表示相对于设备上一次事件的变化,例如鼠标滚轮的滚动。

        4. `EV_ABS`(0x03):表示绝对事件。用于表示设备上的绝对位置,例如触摸屏的触摸点坐标。

        5. `EV_MSC`(0x04):表示杂项事件。用于表示一些特殊事件,如设备的状态改变。

        6. `EV_SW`(0x05):表示开关事件。用于表示开关状态的改变,如设备的开启和关闭状态。

        7. `EV_LED`(0x11):表示LED事件。用于控制LED灯的开关状态。

        8. `EV_SND`(0x12):表示声音事件。用于控制声音设备的状态,例如音量调节。

        9. `EV_REP`(0x14):表示重复事件。用于控制自动重复的设置,例如按键自动重复。

        10. `EV_FF`(0x15):表示力反馈事件。用于控制力反馈设备(如震动手柄)的力反馈效果。

        每个事件类型都有对应的数据结构和事件码,用于描述具体的事件信息。应用程序可以通过读取输入设备节点来获取事件信息,并根据事件类型和事件码进行相应的处理。这样,应用程序可以响应用户的输入操作,实现各种交互功能。

二、事件类型的常见动作

在Linux输入子系统中,每个事件类型都有一个对应的事件码(Event Code),用于标识该类型事件的具体内容。事件码是一个整数值,不同的事件类型有不同的事件码范围。以下是一些常见的事件类型及其对应的事件码:

        1. `EV_KEY`(键盘事件):
   - `BTN_LEFT` (0x110):左键按下或释放
   - `BTN_RIGHT` (0x111):右键按下或释放
   - `KEY_A` (0x0041):A键按下或释放
   - `KEY_ENTER` (0x001c):回车键按下或释放
   - 等等,还有许多其他键的事件码

        2. `EV_REL`(相对事件):
   - `REL_X` (0x00):X轴相对位移
   - `REL_Y` (0x01):Y轴相对位移
   - `REL_HWHEEL` (0x06):水平滚轮相对位移
   - 等等,还有其他相对位移的事件码

        3. `EV_ABS`(绝对事件):
   - `ABS_X` (0x00):X轴绝对坐标
   - `ABS_Y` (0x01):Y轴绝对坐标
   - `ABS_PRESSURE` (0x18):触摸屏压力值
   - 等等,还有其他绝对坐标的事件码

        4. `EV_MSC`(杂项事件):
   - `MSC_SERIAL` (0x00):序列号
   - `MSC_PULSELED` (0x01):脉冲LED指示灯
   - 等等,还有其他杂项事件的事件码

        5. `EV_SW`(开关事件):
   - `SW_LID` (0x00):笔记本电脑盖子状态开关
   - `SW_POWER` (0x01):电源按钮开关
   - 等等,还有其他开关事件的事件码

        这些事件码表示了不同类型的事件内容,应用程序可以根据事件类型和事件码来确定输入设备发送的具体事件,并进行相应的处理。

        注意

        上述列举的事件码只是一小部分常见的事件,实际上,Linux输入子系统支持更多事件类型和事件码,不同的硬件设备可能会有不同的事件类型和事件码。如果你需要获取特定设备的事件码,请查阅对应设备的文档或内核头文件来了解其支持的事件类型和事件码。

三、获取触摸屏的分辨率

  struct input_absinfo用于描述输入设备(包括触摸屏)的绝对坐标信息。

        以下是struct input_absinfo的定义:

struct input_absinfo {__s32 value;__s32 minimum;__s32 maximum;__s32 fuzz;__s32 flat;__s32 resolution;
};
  • value: 当前的坐标值。

  • minimum: 坐标的最小值。

  • maximum: 坐标的最大值。

  • fuzz: 坐标的模糊值。表示坐标值的一小部分可能是无效的,因为硬件的精度有限。

  • flat: 坐标的平坦度。表示坐标值在相邻时间段内的变化较小时被认为是无效的。

  • resolution: 坐标的分辨率。表示坐标值的精确度,通常以单位/毫米(units/mm)为单位。

        获取输入设备的绝对事件信息(例如触摸屏的坐标范围和分辨率):

#include <stdio.h>
#include <linux/input.h>
​
int main() {int fd = open("/dev/input/eventX", O_RDONLY);if (fd < 0) {perror("Error opening device");return 1;}
​struct input_absinfo absinfo_x, absinfo_y;if (ioctl(fd, EVIOCGABS(ABS_X), &absinfo_x) == -1 ||ioctl(fd, EVIOCGABS(ABS_Y), &absinfo_y) == -1) {perror("Error getting absolute axis info");close(fd);return 1;}
​printf("X axis: min=%d, max=%d\n", absinfo_x.minimum, absinfo_x.maximum);printf("Y axis: min=%d, max=%d\n", absinfo_y.minimum, absinfo_y.maximum);
​close(fd);return 0;
}

        请注意,上述示例代码中的/dev/input/eventX需要替换为正确的输入设备节点路径X是对应的事件号。这些示例代码只是基本用法,实际使用中可能需要添加错误处理和其他功能。同时,需要以合适的权限运行这些代码,通常需要root或者有相应访问权限的用户。

        这里的X指的就是设备文件名,在上一篇文章中这里有说明:

 【玩转Linux】Linux输入子系统简介_祐言QAQ的博客-CSDN博客

四、触摸屏示例代码

        当我们知道了如何开启触摸屏文件以及如何获取触摸屏的分辨率后,我们就可以使用它了,下面是一个简单的示例,在这个例子中我们使用了Linux输入子系统处理触摸屏输入的程序。

        它通过打开触摸屏设备文件/dev/input/event0,读取触摸事件,并解析事件来获取触摸屏的坐标位置。然后根据触摸坐标位置判断点击的区域,并进行相应的处理。

        代码主要包括以下几个部分:

        1.get_xy函数

        该函数用于从触摸屏设备中读取输入事件,并解析出X和Y轴的坐标值。在这里,通过read函数读取输入事件,判断事件类型是否是绝对事件(触摸事件),并根据事件类型设置对应的坐标值。

       2. main函数

        主函数中先打开触摸屏设备文件,并通过一个无限循环不断读取触摸事件。然后使用get_xy函数获取坐标值,并根据坐标值判断点击的区域。根据区域的判断结果,打印出相应的信息,比如"相册"、"音乐"、"视频"或"游戏"。
 

        图示是这样:

         代码:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/input.h>#define TOUCH_DEV "/dev/input/event0" // 触摸屏设备文件路径void get_xy(int touch_fd,int *x,int *y)
{struct input_event buf;*x = -1;*y = -1;while (1){// 读取触摸事件int ret = read(touch_fd, &buf, sizeof(buf));if (ret == -1){perror("read fail");exit(errno);}// 判断事件类型是否是触摸事件if (buf.type == EV_ABS){// 根据事件类型设置对应的坐标值if (buf.code == ABS_X){*x = (buf.value * 800) / 1024;}	if (buf.code == ABS_Y){*y = (buf.value * 800) / 1024;}}if (!(*x > 0 && *x < 800 && *y > 0 && *y < 480)){continue;}	if(*x>-1 && *y>-1){break; // 得到坐标后退出}	}}int main(int argc, char *argv[])
{int x,y;// 打开触摸屏int touch_fd = open(TOUCH_DEV, O_RDONLY);if (touch_fd < 0){perror("打开触摸屏失败");exit(errno);}while(1){// 拿到一组完整的坐标就返回get_xy(touch_fd, &x, &y);// 使用返回的坐标,判断点击的哪块区域if( x>0 && x<400 && y>0 && y<240 )	//左上角那块区域printf("相册\n");else if(x>400 && x<800 && y>0 && y<240)		//右上角的那块区域printf("音乐\n");else if(x>400 && x<800 && y>240 && y<480)	//右下角的那块区域printf("视频\n");else if(x>0 && x<400 && y>240 && y<480)	//左下角的那块区域	printf("游戏\n");}// 关闭触摸屏close(touch_fd);return 0;
}

        总体来说,这段代码实现了一个简单的触摸屏交互功能,根据用户的点击位置来显示相应的区域信息。这个例子展示了Linux输入子系统的基本用法,可以在具体的应用中根据需要进行扩展和优化。下面是演示效果:

五、总结

        对于6818开发板使用触摸屏的总结如下:

  1. 触摸屏硬件:6818开发板通常配备了触摸屏硬件,这是一种输入设备,可以通过手指或触控笔进行操作。触摸屏硬件通常与主板通过接口连接,例如串口或USB。

  2. Linux输入子系统:在Linux系统中,触摸屏被视为一个输入设备,并由Linux输入子系统进行管理和处理。输入子系统负责接收触摸屏的输入事件,并将其转换为用户空间的事件供应用程序使用。

  3. 触摸屏设备文件:在Linux系统中,触摸屏设备会以字符设备的形式出现在/dev/input/目录下,通常命名为eventX,其中X为数字。用户可以通过打开这个设备文件,并读取其中的输入事件来获取触摸屏的坐标信息。

  4. 获取触摸坐标:通过打开触摸屏设备文件,并读取其中的输入事件,可以获取触摸屏的坐标信息。触摸坐标通常以绝对坐标形式提供,即X轴和Y轴的具体数值。

  5. 处理触摸事件:在应用程序中,可以使用循环结构读取触摸屏设备文件,并解析读取到的输入事件,从中获取触摸坐标信息。然后根据触摸坐标信息进行相应的处理,比如根据坐标位置判断点击的区域,进行交互或控制操作。

  6. 应用场景:触摸屏在嵌入式系统中广泛应用,特别适合具有交互界面的应用场景,如嵌入式终端、信息展示设备、智能家居控制面板、工业自动化设备等。通过触摸屏,用户可以直接在屏幕上进行交互操作,增加了设备的便捷性和用户体验。

        总的来说,对于6818开发板来说,使用触摸屏可以实现更加直观、方便的交互操作,为嵌入式系统提供了更加友好的用户界面。通过Linux输入子系统的支持,开发人员可以轻松获取触摸屏的输入信息,并根据具体应用场景实现不同的交互功能。

 

        更多C语言Linux系统相关文章,关注专栏:

   手撕C语言

            玩转linux

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

相关文章:

【Liux下6818开发板(ARM)】触摸屏

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…...

苍穹外卖day11——数据统计图形报表(Apache ECharts)

效果展示 Apache ECharts 介绍 常见图表 入门案例 快速上手 - Handbook - Apache ECharts 营业额统计——需求分析与设计 产品原型 接口设计 VO设计 营业额统计——代码开发 Controller中 /*** 数据统计相关接口*/ RestController RequestMapping("/admin/report&qu…...

在制作PC端Game Launcher游戏启动器时涉及到的技术选型

1&#xff09;在制作PC端Game Launcher游戏启动器时涉及到的技术选型​ 2&#xff09;​如何将图片显示到Canvas的Raw Image上面 3&#xff09;Unity 2018.4.4f1退出重启后出现黑屏 4&#xff09;如何获取到GPU耗时 这是第346篇UWA技术知识分享的推送&#xff0c;精选了UWA社区…...

SQL力扣练习(九)

目录 1.订单最多的用户(586) 示例 1 解法一(limit) 解法二(dense_rank()) 2.体育馆的人流量 示例 1 解法一(临时表) 解法二&#xff08;三表法&#xff09; 1.订单最多的用户(586) 表: Orders --------------------------- | Column Name | Type | ---------…...

软考高级架构师笔记-10数学计算题

目录 1. 前文回顾 & 考情分析2. 最小生成树3. 最短路径4. 网络与最大流量5. 线性规划6. 动态规划/决策表7. 博弈论8. 状态转移矩阵9. 决策论10. 结语1. 前文回顾 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔记-2计算机软件(操作系统)软考…...

设计模式五:建造者模式(Builder Pattern)

建造者模式(Builder Pattern)是一种创建型设计模式&#xff0c;用于通过一系列步骤来构建复杂对象。它将对象的构建过程与其表示分离&#xff0c;从而允许相同的构建过程可以创建不同的表示。 建造者模式中的几个角色&#xff1a; 产品(Product)&#xff1a;表示被构建的复杂…...

C++多线程编程(包含c++20内容)

C多线程编程(包含c20内容) 文章目录 C多线程编程(包含c20内容)线程通过函数指针创建线程通过函数对象创建线程通过lambda创建线程通过成员函数创建线程线程本地存储取消线程自动join线程从线程获得结果 原子操作库原子操作原子智能指针原子引用使用原子类型等待原子变量 互斥互…...

【C语言】通讯录2.0 (动态增长版)

前言 通讯录是一种记录联系人信息的工具&#xff0c;包括姓名、电话号码、电子邮件地址、住址等。 文章的一二三章均于上一篇相同&#xff0c;可以直接看第四章改造内容。 此通讯录是基于通讯录1.0&#xff08;静态版&#xff09;的基础上进行改进&#xff0c;请先看系列文字第…...

详解AMQP协议以及JAVA体系中的AMQP

目录 1.概述 1.1.简介 1.2.抽象模型 2.spring中的amqp 2.1.spring amqp 2.2.spring boot amqp 1.概述 1.1.简介 AMQP&#xff0c;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议。 百度百科上的介绍&#xff1a; 一个提供统一消息服务的应用层标准高…...

跨境电商外贸常态下,深度分析Live Market的优势

据统计&#xff0c;今年上半年&#xff0c;面对复杂严峻的外部环境&#xff0c;我国外贸进出口规模在历史同期首次突破20万亿元&#xff0c;展现较强韧性。我国正处于大力支持跨境电商发展的时代节点。在此背景下,无数商家准备抓住时代机遇,将品牌影响力从国内延伸至全世界。同…...

vue2企业级项目(八)

vue2企业级项目&#xff08;八&#xff09; 组件封装&#xff08;二&#xff09; 4、searchForm 创建components/searchForm/index.js import XSearchForm from "./index.vue"; export default XSearchForm;使用案例 <template><div class"wrap"…...

小研究 - 主动式微服务细粒度弹性缩放算法研究(二)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放&#xff0c;忽略了能够充分利用单台服务器资源的细粒度垂直缩放&#xff0c;从而导致资源浪费。为此&#xff0c;本文设计了主动式微服务细粒度弹性缩放算法…...

【雕爷学编程】Arduino动手做(177)---ESP-32 掌控板

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…...

使用Gunicorn+Nginx部署Flask项目

部署-开发机上的准备工作 确认项目没有bug。用pip freeze > requirements.txt将当前环境的包导出到requirements.txt文件中&#xff0c;方便部署的时候安装。将项目上传到服务器上的/srv目录下。这里以git为例。使用git比其他上传方式&#xff08;比如使用pycharm&#xff…...

【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟

目录 1.认识时钟树&#xff08;掌握&#xff09;1.1什么是时钟&#xff1f;1.2认识时钟树&#xff08;F1&#xff09;1.2.1STM32F103时钟树简图1.2.2STM32CubeMX时钟树&#xff08;F103&#xff09; 1.3认识时钟树&#xff08;F4&#xff09;1.3.1F407时钟树1.3.2F429时钟树1.3…...

Kotlin基础(十):函数进阶

前言 本文主要讲解kotlin函数&#xff0c;之前系列文章中提到过函数&#xff0c;本文是kotlin函数的进阶内容。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 函数基本用法 Kotlin 是一种现代的静态类型编程语言&#xff0c;它在函数的定义和使用上有一些特点…...

计算机视觉(四)神经网络与典型的机器学习步骤

文章目录 神经网络生物神经元人工神经元激活函数导数 人工神经网络“层”的通俗理解 前馈神经网络Delta学习规则前馈神经网络的目标函数梯度下降输出层权重改变量 误差方向传播算法误差传播迭代公式简单的BP算例随机梯度下降&#xff08;SGD&#xff09;Mini-batch Gradient De…...

使用easyui的tree组件实现给角色快捷分配权限功能

这篇文章主要介绍怎么实现角色权限的快捷分配功能&#xff0c;不需要像大多数项目的授权一样&#xff0c;使用类似穿梭框的组件来授权。 具体实现&#xff1a;通过菜单树的勾选和取消勾选来给角色分配权限&#xff0c;在这之前&#xff0c;需要得到角色的菜单树&#xff0c;角色…...

Postman打不开/黄屏/一直转圈/Windows

环境背景 内网环境Postman-win64-8.11.1-Setup.exe 问题描述 电脑重启后&#xff0c;打开Postman后&#xff0c;出现加载弹窗&#xff1a;Preparing your workspaces…This might take a few minutes&#xff1b; 等待数分钟后&#xff0c;还是没有反应&#xff0c;于是关闭…...

使用SVM模型完成分类任务

SVM&#xff0c;即支持向量机&#xff08;Support Vector Machine&#xff09;&#xff0c;是一种常见的机器学习算法&#xff0c;用于分类和回归分析。SVM的基本思想是将数据集映射到高维空间中&#xff0c;在该空间中找到一个最优的超平面&#xff0c;将不同类别的数据点分开…...

计算机毕设 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉…...

开发经验分享之:import引入包和@Autowired注入类有什么区别

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 import 和 Autowired 想必大家在 Java 开发中使用频率最多的关键字之一了把&#xff0c;这篇博客将解释这两个概念的区别和作用&#xff0c;帮助你更好地理解它们在Ja…...

MySQL和Oracle区别

由于SQL Server不常用&#xff0c;所以这里只针对MySQL数据库和Oracle数据库的区别 (1) 对事务的提交 MySQL默认是自动提交&#xff0c;而Oracle默认不自动提交&#xff0c;需要用户手动提交&#xff0c;需要在写commit;指令或者点击commit按钮 (2) 分页查询 MySQL是直接在SQL…...

QT--day6(人脸识别、图像处理)

人脸识别&#xff1a; /***********************************************************************************头文件****************************************************************************************/#ifndef WIDGET_H #define WIDGET_H#include <QWidget>…...

深度学习:常用优化器Optimizer简介

深度学习&#xff1a;常用优化器Optimizer简介 随机梯度下降SGD带动量的随机梯度下降SGD-MomentumSGDWAdamAdamW 随机梯度下降SGD 梯度下降算法是使权重参数沿着整个训练集的梯度方向下降&#xff0c;但往往深度学习的训练集规模很大&#xff0c;计算整个训练集的梯度需要很大…...

【算法心得】二维dp的状态转移狂练

LCS&#xff1a; LCS变式&#xff1a;使两个字符串变成一样的&#xff0c;删除的和最小 https://leetcode.cn/problems/minimum-ascii-delete-sum-for-two-strings/ 建表 m ∗ n m*n m∗n or ( m 1 ) ∗ ( n 1 ) (m1)*(n1) (m1)∗(n1)&#xff1f; 感觉 ( m 1 ) ∗ ( n …...

JMeter常用内置对象:vars、ctx、prev

在前文 Beanshell Sampler 与 Beanshell 断言 中&#xff0c;初步阐述了JMeter beanshell的使用&#xff0c;接下来归集整理了JMeter beanshell 中常用的内置对象及其使用。 注&#xff1a;示例使用JMeter版本为5.1 1. vars 如 API 文档 所言&#xff0c;这是定义变量的类&a…...

【C++从0到王者】第十四站:list基本使用及其介绍

文章目录 一、list基本介绍二、list基本使用1.尾插头插接口使用2.insert接口使用3.查找某个值所在的位置4.erase接口使用以及迭代器失效5.reverse6.sort7.merge8.unique9.remove11.splice 三、list基本使用完整代码 一、list基本介绍 如下所示&#xff0c;是库里面对list的基本…...

正则表达式、常用的正则

文章目录 正则表达式字符含意义RegExp函数RegExp属性RegExp对象方法RegExp构造函数的第二个参数 常用的正则例子只包含数字&#xff08;包括正数、负数、零&#xff09;只包含中英文数字及键盘上的特殊字符校验密码是否符合规则的正则校验http或者https端口号的正则只校验端口号…...

ST官方基于米尔STM32MP135开发板培训课程(一)

本文将以Myirtech的MYD-YF13X以及STM32MP135F-DK为例&#xff0c;讲解如何使用STM32CubeMX结合Developer package实现最小系统启动。 1.开发准备 1.1 Developer package准备 a.Developer package下载&#xff1a; ‍https://www.st.com/en/embedded-software/stm32mp1dev.ht…...