ARM开发板——实时获取用户点击触摸屏的LCD坐标信息(阻塞式读取)

ARM开发板——实时获取用户点击触摸屏的LCD坐标信息(阻塞式读取)

目录
  • ARM开发板——实时获取用户点击触摸屏的LCD坐标信息(阻塞式读取)
    • 1、硬件信息
    • 2、代码需求
    • 3、代码实现

1、硬件信息

ARM开发板使用的内核为CotexA53芯片,LCD屏为七寸800 * 480像素,触摸屏为1024 * 600

2、代码需求

实时监听用户点击触摸屏的事件,并获取点击位置(LCD坐标)

3、代码实现

基本步骤:

  1. 打开触摸屏设备文件,触摸屏设备文件位于/dev/input/event0;

  2. 创建输入事件结构体,该结构体定义于/usr/include/linux/input.h;

    /** /usr/include/linux/input.h 摘录*/ /** The event structure itself*/struct input_event {struct timeval time;__u16 type;__u16 code;__s32 value;
    };// ...省略/** Event types*/#define EV_SYN			0x00
    #define EV_KEY			0x01
    #define EV_REL			0x02
    #define EV_ABS			0x03     // 绝对位置
    #define EV_MSC			0x04
    #define EV_SW			0x05
    #define EV_LED			0x11
    #define EV_SND			0x12
    #define EV_REP			0x14
    #define EV_FF			0x15
    #define EV_PWR			0x16
    #define EV_FF_STATUS		0x17
    #define EV_MAX			0x1f
    #define EV_CNT			(EV_MAX+1)// ...省略/** Absolute axes*/#define ABS_X			0x00			// x轴
    #define ABS_Y			0x01			// y轴
    #define ABS_Z			0x02
    #define ABS_RX			0x03
    #define ABS_RY			0x04
    #define ABS_RZ			0x05
    #define ABS_THROTTLE		0x06
    #define ABS_RUDDER		0x07
    #define ABS_WHEEL		0x08
    #define ABS_GAS			0x09
    #define ABS_BRAKE		0x0a
    #define ABS_HAT0X		0x10
    #define ABS_HAT0Y		0x11
    #define ABS_HAT1X		0x12
    #define ABS_HAT1Y		0x13
    #define ABS_HAT2X		0x14
    #define ABS_HAT2Y		0x15
    #define ABS_HAT3X		0x16
    #define ABS_HAT3Y		0x17
    #define ABS_PRESSURE		0x18
    #define ABS_DISTANCE		0x19
    #define ABS_TILT_X		0x1a
    #define ABS_TILT_Y		0x1b
    #define ABS_TOOL_WIDTH		0x1c
    
  3. 循环读取事件(阻塞式读取);

    在ARM开发板的触摸屏事件监听中,看似“死循环”的代码设计其实并非低效的忙等待(busy-waiting),而是基于阻塞式读取(blocking read)的事件驱动机制:

    • 当调用 read(fd, &event, sizeof(event)) 时,若设备文件(如 /dev/input/event0)无事件发生,内核会将进程挂起(进入阻塞状态),此时不占用CPU资源,直到有触摸事件触发中断,内核唤醒进程并返回数据。
    • 示例代码中的 while(1) 循环本质上是等待事件的“休眠-唤醒”过程,而非持续消耗CPU的忙等待。
    行为 资源占用 实现场景
    阻塞式读取(read 无事件时CPU占用率接近0% 适用于实时事件监听
    忙等待(轮询) 持续占用CPU(如 while(1) { poll(); } 需避免,仅用于极低延迟场景

    嵌入式系统中类似机制广泛存在(如传感器数据采集),均依赖阻塞IO而非主动轮询,在典型ARM Linux系统中,阻塞式读取触摸屏事件的进程在无操作时CPU占用率为0%,触摸事件响应延迟在10ms以内

  4. 根据event结构体的type 判断是否为绝对位置,code判断是y轴还是x轴数据;

  5. 将触摸屏坐标转换为LCD坐标后输出坐标信息;

具体实现如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <linux/input.h>
#include <unistd.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{// 1、打开触摸屏设备文件int touch = open("/dev/input/event0", O_RDWR);if (touch == -1){printf("文件打开出错!");exit(-1);}// 2、创建输入事件结构体struct input_event event;// 3、循环读取事件(阻塞式读取)int count = 0;int x = 0;int y = 0;while (1){ssize_t size = read(touch, &event , sizeof(struct input_event));if(event.type == EV_ABS){if(event.code == ABS_X){count ++;x = event.value * 800 / 1024;  // lcd_width: 800,触摸屏x:1024} if(event.code == ABS_Y){count ++;y = event.value * 480 / 600; // lcd_height: 480, 触摸屏y:600} if(count ==2) {printf("x = %d\t", x);printf("y = %d\n", y);count = 0;}}}// 4、关闭文件close(touch);return 0;
}

编译后传输至开发板测试:

[root@GEC6818 /workspace/touchtest]#./touchtest
x = 316 y = 229
x = 402 y = 332
x = 388 y = 336
x = 133 y = 377
x = 29 y = 412
x = 1 y = 468
x = 1 y = 236
x = 5 y = 222
x = 58 y = 231
x = 114 y = 250
x = 444 y = 272
x = 576 y = 271
x = 723 y = 262
x = 798 y = 244
x = 798 y = 254

测试无误,需求实现!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904445.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20244202 《Python程序设计》实验一报告

20244202 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2442 姓名: 陈艺豪 学号:20244219 实验教师:王志强 实验日期:2025年3月23日 必修/选修: 公选课 1.实验内容 (1).熟悉Python开发环境; (2).练习Python运行、调试技能; (3).编写程序,练习变量和类…

USTCPC 2025 游记

队名 合肥一中能不能多请点OI教练,二人队。队长 @包涵宇 ,省队爷。 Day -inf~0 随机写了几道有意思的 cf 。 bhy 又在做黑的插头 dp 。膜拜。 Day 1 早上被父母逼着学习文化课,结果作业做不完直接半红温状态,, 加上昨天做了 ~8h 文化课作业只完成了 1/2 ,然后直接不做了…

AI运维助手-LinuxAgent

介绍 LinuxAgent是基于LLM大模型的智能运维助手,通过接入DeepSeek API实现对Linux终端的自然语言控制,可以实现高效的运维工作。目前已经更新到2.0.5版本。 LinuxAgent能够理解用户的自然语言指令,只要描述需求,系统自动解析意图并执行,支持中文、英语等,可以理解复杂的多…

微服务Elasticsearch

Elasticsearch中倒排索引 为什么查询效率高 比如说一个商品 在一百万条数据中 你如果要搜的话 他会从一百万条数据中去寻找 比如说你要搜小米手机 但是倒排索引是这样的 //倒排 { "小米": [1], "手机": [1,2,3,4], } 他在给定的文档范围内去搜索 比如说正…

20242825 2024-2025-2 《网络攻防实践》第四周作业

@目录一. 实验内容1.1 实验内容概述1.2 实验相关知识概述二. 实验过程2.1 ARP缓存欺骗攻击2.1.1 实验环境配置2.1.2 连通性测试2.1.3 继续实验实验亮点出现问题检查问题解决问题2.2 ICMP重定向攻击2.2.1 实验环境配置2.2.2 连通性测试发现问题检查问题解决问题2.2.3 继续实验…

论文解读-Advances in 3D Generation: A Survey

论文介绍 题目: Advances in 3D Generation: A Survey 发表年份是 2024年,综述性质的文章,是看到腾讯发布了混元3D大模型所以来看看这个论文主要贡献 论文主要根据当前研究领域内不同的3D资产的生成方法进行了一个分类,将3D生成算法分为:前馈生成,基于优化的生成,基于过…

大数据技术

Hadoop Hadoop是一个能够对大量数据进行分布式处理的软件框架 HDFS ​ HDFS(Hadoop Distributed File System,Hadoop的分布式文件管理系统),是Hadoop的两大核心之一,用于管理数据和文件 Hadoop安装 ​ Hadoop可以在Window系统上运行,但其官方支持的操作系统只有Liunx,所以…

User\main.c(7): error: #5: cannot open source input file ds18b02.h: No such file or directory

报错截图解决途径 复制报错信息上网搜索,一般的解决办法:在c/c++选项中的Include Paths中包含头文件,将移植过来的代码放到指定的文件夹里,在Floder Setup中设置新移植的文件路径。很可惜我确认过我包含了头文件,但仍然报同样错误。 最后发现我代码里面是 #include"d…

Bean注入几种方式 (放入Spring容器)

目录 1、XML方式注入set方式注入构造方法注入2、注解方式注入@Component + @ComponentScan@Configuration + @Bean + @ComponentScan@Import3、实现ImportBeanDefinitionRegistrar接口 4、实现FactoryBean 5、实现BeanDefinitionRegistryPostProcessor 一、XML方式注入 在现在这…

自然资源数据要素支撑场景建设

自然资源数据要素与场景建设是推动经济社会高质量发展的重要途径。随着数字经济的快速发展,自然资源数据已成为关键的生产要素,其价值挖掘和利用成为推动经济社会发展的关键。自然资源数据要素的重要性自然资源数据要素包括地理、土地、矿产、海洋等多源数据,是支撑经济社会…

C语言分支与循环基础应用编程

实验任务1#include<stdio.h> #include<stdlib.h> #include<time.h> #define N 5int main() {int number;int i;srand(time(0));for(i=0;i<N;++i){number=rand()%100+1;printf("20490042%04d\n",number);}return 0; }问题1:生成一个1~100的随机…