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

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

测试无误,需求实现!

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

  1. 使用arm开发板搭建无线mesh网络(二)

    上篇博文介绍了无线mesh网络和adhoc网络的区别,这篇文章将介绍无线mesh网络的骨干网节点的组建过程.首先需要介绍下骨干网节点的设计方案:每个骨干网节点都是由一块友善之臂的tiny6410 ar ...

  2. Windows10、ARM开发板、VMware虚拟机同时连接Internet

    前段时间有人遇到一些网络连接问题,让我帮忙处理,他想让ARM开发板连接外网,可以连接网络数据库,同时保证自己的电脑可以上网. 本来说直接可以连接一个路由器,分配一个内网IP给ARM就可以了,但是当时那 ...

  3. 使用arm开发板搭建无线mesh网络(一)

    由于项目的需要,老板让我使用arm开发板(友善之臂的tiny6410)搭建无线mesh网络.一般而言,无线自组织网络的网络设备都是由用户的终端设备来充当,这些终端设备既要处理用户的应用数据,比如娱乐, ...

  4. ARM开发板挂载Ubuntu18.04主机的NFS共享文件夹

    环境 ubuntu主机环境:Window10 下装VMWare下装的 ubuntu18.04LTS x64 IP 192.168.10.119 Window10下配置192.168.10该网段 开发板 ...

  5. ARM开发板挂载U盘

    ARM开发板运行Linux系统后,插入U盘,通过串口打印系统识别到U盘如下: 系统识别U盘盘符为sda4 那么需要挂载后才能操作U盘:挂载命令 mount -t vfat /dev/sda4 /mnt ...

  6. 关于ARM开发板与PC主机的网络设置问题

    直观来讲,ARM开发板多数情况下会有条网线与主机相连,所以最重要的一步是保证PC主机与ARM开发板能互通. 互通的意思进一步来讲就是互相能ping通.也就是说在瘟都死的dos下(假设主机是瘟都死系统) ...

  7. ARM开发板挂载虚拟机 nfs目录

    ARM开发板做相关开发,为了调试方便,常把开发板mnt目录挂载到虚拟机nfs共享目录上,这样调试程序时候就不用把程序转到开发板上再运行,方便很多.要挂载nfs共享目录,需要安装必要的组件支持. 1.虚 ...

  8. 【记录】尝试用QEMU模拟ARM开发板去加载并运行Uboot,kernel,rootfs【转】

    转自:https://www.crifan.com/try_use_qemu_emulate_arm_board_to_load_and_run_uboot_kernel_rootfs/ [背景] 手 ...

  9. ubuntu 交叉编译qt 5.7 程序到 arm 开发板

    ubuntu 交叉编译qt 5.7 程序到 arm 开发板平台1 ubuntu 12.042 arm-linux-gcc 4.5.13 QT 5.74 开发板210 armcortex-A8 一 概述 ...

  10. Arm开发板+Qt学习之路

    从2015.11.13日开始接触arm开发板,开始学习Qt,到现在已经四个月零17天了,从一个拿到开发板一无所知的小白,到现在能够在开发板上进行开发,有付出有收获. 之前一直没有时间将这个过程中的一些 ...

随机推荐

  1. Solution Set -「OurOJ Contest #2587」浅写

    \(\mathscr A\sim\)「OurOJ #47030」_   Link & Submission & Tags:「A.DP-计数 DP」「A.数学-Stirling 数/反演 ...

  2. asp.net core中,使用CancellationToken在用户终止请求时取消所有异步操作+ abp中的设计

    如果一个Controller.Action里的处理非常耗时,比如读数据库.文件操作.调用第三方接口等此时用户随时可能关闭浏览器.F5刷新网页等操作.但是服务端的耗时代码任然在执行,这太浪费了,既然用户 ...

  3. springboot starter 原理解析及实践

    什么是springboot starter starter是springBoot的一个重要部分.通过starter,我们能够快速的引入一个功能,而无需额外的配置.同时starter一般还会给我提供预留 ...

  4. w3cschool-Linux shell教程

    Shell 教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个 ...

  5. MySQL查看、修改字符集及Collation

    前言在使用MySQL的过程中,可能会出现初始设计使用的字符集或Collation不符合当前需求的情况.如使用utf8的表(MySQL中的utf8即utf8mb3)要支持emoji,而utf8mb3不支 ...

  6. 鸿蒙页面开发 - 组件复用样式 @Styles

    这篇文章介绍一个装饰器 @Styles 他的主要作用是: 当多个组件都有相同的样式,如果每个组件单独设置,会造成大量重复的代码冗余.这时我们可以使用 @Styles 将这些相同样式封装成一个方法,供这 ...

  7. Q:linux(群晖)修改网卡速率

    问题:群晖速度莫名其妙变成了1MB/s左右,查看网络状态 网卡配置变成 全双工10Mb/s 解决方法 首先开启ssh登录权限 1.控制面板 – 终端机和SNMP里,开启SSH功能. 2.通过ssh连接 ...

  8. Iceberg的Copy on Write和Merge On Read介绍

    一.默认的Copy on Write Copy no Write模式指的是在进行更新数据时,先将数据拷贝出来进行相应的更新,再替换掉原先的数据 二.Merge On Read读取时合并 在v2版本才支 ...

  9. Java连接数据库 CreateStatement 和 PrepareStatement 的区别与优劣

    一.简介 先说下CreateStatement 和 PrepareStatement 这俩到底是干啥的吧. 作用:其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方 ...

  10. Luogu P5005 中国象棋 - 摆上马 / Luogu P8756 国际象棋 题解 [ 蓝 ] [ 状压 dp ] [ 位运算 ]

    国际象棋:模板棋盘状压. 摆上马:需要点思维的棋盘状压,相比上一道题加了"蹩马脚"的设定. Easy_version :国际象棋 概述一下此类棋盘问题的思路: 用二进制数表示出棋盘 ...