Linux下C语言检测多个按键按下状态的方法

2023-05-16

在需要同时监听多个按键按下状态的情况下,可以通过监听/dev/input/event事件的方法来判断按键的状态。比如对于通过键盘控制小车时,有可能多个方向键同时按下,需要同时监测到,通过前面文章的方法可以有效监控单个按键的消息,但是不能同时监控多个按键同时按下的信息。需要通过记录键盘的按下和释放事件来确定当前键盘的状态,以方向键盘组合按键为例,示例程序如下:

#include <stdio.h>  
#include <unistd.h>
#include <linux/input.h>  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <fcntl.h>  

int main()  
{ 
    int keys_fd;  
    input_event t;

    char device[] = "/dev/input/event6";

    keys_fd = open(device, O_RDONLY);  
    if(keys_fd <= 0)  
    { 
        printf("Open %s device error!\n", device);  
        return -1;  
    }

    bool up = 0, down = 0, left = 0, right = 0;     //true for pressed, flase for released
    double vel = 0, yaw = 0;
    while(1)  
    {  
        if(read(keys_fd, &t, sizeof(t)) != sizeof(t)) continue;

	if(t.type != EV_KEY) continue;

        if (t.code == KEY_ESC) break;

        if (t.code == KEY_LEFT) left = t.value;
        if (t.code == KEY_RIGHT) right = t.value;
        if (t.code == KEY_UP) up = t.value;
        if (t.code == KEY_DOWN) down = t.value;

        yaw = left ? -1 : right ? 1 : 0;
        vel = up ? 1 : down ? -1 : 0;

        printf("Control vel %.1lf, yaw %.1lf\n", vel, yaw);
    }  

    close(keys_fd);  
    return 0;  
}

如上,监听键盘输入对应的事件(本机为/dev/input/event6),记录方向键的按下和释放事件,从而确定各个方向键的按下状态,从而确定相应的遥控指令(vel, yaw)。

不同的机器键盘对应的事件名称不一定一样,可以通过

$ cat /proc/bus/input/devices

来查看键盘对应的事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下C语言检测多个按键按下状态的方法 的相关文章

  • %config(noreplace) 文件上出现意外的 RPM 冲突

    我正在创建我自己的RPM using rpmbuild My RPM 包含配置文件哪个应该永远不会被覆盖 即使 RPM 包含这些配置文件的新版本 为了存档这个 我用以下标签标记了它们 config noreplace opt mypacka
  • python 可以检测它运行在哪个操作系统下吗?

    python 可以检测操作系统 然后为文件系统构建 if else 语句吗 我需要将 Fn 字符串中的 C CobaltRCX 替换为 FileSys 字符串 import os path csv from time import strf
  • 在Linux中将日期附加到文件名

    我想在文件名旁边添加日期 somefile txt 例如 somefile 25 11 2009 txt 或 somefile 25Nov2009 txt 或任何类似的内容 也许脚本或终端窗口中的某些命令可以执行 我正在使用Linux Ub
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 为什么 proc/ID/maps 有多个共享库条目

    我正在查看嵌入式Linux下的proc ID maps 我注意到一些共享库在进程的内存映射中出现了几次 为什么会这样呢 40094000 400d9000 r xp 00000000 b3 09 723 system lib libc so
  • X 服务器使用什么像素格式?

    X 服务器使用什么像素格式 RGBA ARBG BGRA 如果有任何特定格式的话 Update 我专门寻找有关颜色分量顺序和位模式的信息 你的意思是帧缓冲区格式 或者所有支持的像素图格式 无论是哪一种 都取决于您的图形硬件 驱动程序和配置
  • Laravel 内存问题?

    各位 我在 DO 服务器上遇到这样的问题 我已经尝试了一切 整个网站在使用 Homestead 的 Linux 服务器上 100 正常工作 但上传后 它只能工作一次 在重新加载或刷新页面后会多次下降 我尝试增加 apache 服务器的内存
  • _dl_runtime_resolve -- 共享对象何时加载到内存中?

    我们有一个对性能要求很高的消息处理系统 最近我们注意到第一条消息比后续消息花费的时间要长很多倍 当它通过我们的系统时 会发生大量转换和消息增强 其中大部分是通过外部库完成的 我刚刚描述了这个问题 使用 callgrind 将仅一条消息的 运
  • 选择多个模式的 awk 代码

    这是我的输入文件 比如modified txt r4544 n479826 2012 08 28 07 12 33 0400 Tue 28 Aug 2012 1 line Changed paths M branches 8 6 0 con
  • 如何从python导入路径中删除当前目录

    我想使用 Mercurial 存储库hg本身 也就是说 我克隆了 Mercurialhttps www mercurial scm org repo hg https www mercurial scm org repo hg并想运行一些h
  • C/C++ with GCC:静态地将资源文件添加到可执行文件/库

    有人知道如何使用 GCC 将任何资源文件静态编译为可执行文件或共享库文件吗 例如 我想添加永远不会改变的图像文件 如果它们改变了 我无论如何都必须替换该文件 并且不希望它们位于文件系统中 如果这是可能的 我认为这是因为 Visual C f
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 无法使用 tar -cvpzf 解压完整目录

    把我的头敲在这上面 I used tar cvpzf file tar gz压缩一个完整的目录 我将文件移动到另一台服务器 并尝试解压缩复制存档的目录 无法使其发挥作用 bash 3 2 tar xvpzf news tar gz tar
  • 终止 ssh 会话会终止正在运行的进程

    我正在使用 ssh 连接到我的 ubuntu 服务器 我使用命令启动编码程序 然而 似乎当我的 ssh 会话关闭时 因为我在进入睡眠状态的笔记本电脑上启动它 有没有办法避免这种情况 当然 阻止我的笔记本电脑休眠并不是永久的解决方案 运行你的
  • 如何搭建qtwayland?

    我花了一整天的时间尝试使用QtWayland Compositor 1 0在 Qt 创建者中 我已经遵循了从那里开始的所有步骤https wiki qt io QtWayland https wiki qt io QtWayland但我收到
  • Git - 致命:无法获取当前工作目录?

    When I git clone从回购协议中 我得到 fatal Could not get current working directory No such file or directory 我该怎么办 我检查了服务器并发现 git文
  • 检查上次更改密码的时间[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • Bash 脚本错误 [重复]

    这个问题在这里已经有答案了 我想知道下面的脚本有什么错误 我收到错误为 command not foundh line 1 command not foundh line 2 其连续的 我试过添加 但现在工作请告诉我该怎么做 bin bas
  • Pthread互斥锁由不同线程解锁

    一个天真的问题 我之前读到过 MUTEX 只能由锁定它的线程解锁 但我写了一个程序THREAD1锁定 mutexVar 并进入睡眠状态 然后THREAD2可以直接解锁mutexVar做一些操作并返回 gt 我知道每个人都说我为什么要这样做
  • 如何使用 bash 粘贴来自单独文件的列?

    我想用分隔符 合并不同的列表 第一个列表有 2 个单词 cat first one who 第二个列表有 10000 个单词 cat second languages more simple advanced home expert tes

随机推荐

  • 无人机传感器信号滤波器设计

    由于无人机在飞行过程中受到电机桨叶转动的引起的振动影响 xff0c 从陀螺仪 加速度计等传感器出来的数据需要进行滤波 xff0c 一般是通过低通滤波 xff0c 结合电机的频率特性 xff0c 通常30Hz左右是比较合适的阈值 Matlab
  • TCP网络数据包的组成部分,数据包分片与重组功能

    一个网络数据包包括哪些有了解吗 xff1f 网络数据包一般包括头部和数据部分 xff0c 在TCP协议中 xff0c 要发送的数据经过TCP模块添加TCP头部 xff1b 然后IP模块添加IP头部和MAC头部 xff1b 然后在最前面加上报
  • 无人飞行器数学模型

    这里是运动学和动力学模型 xff0c 也适用于任何其它类型的飞行器 xff0c 乃至无人车等各种载体 飞行器的状态包括位置 xff0c 速度 xff0c 姿态角度 xff0c 角速度 xff0c 姿态也可以用坐标转换矩阵来表示 xff0c
  • 无人飞行器的控制

    飞行器的控制通过几个环来实现 xff0c 外环控制为位置的控制 xff0c 内环控制为姿态的控制 xff0c 通过姿态的控制来实现飞行器的动态控制 xff0c 从而控制飞行器的速度和位置 xff0c 大致框架如下 位置控制根据目标位置得出飞
  • Linux Shell脚本检查一个目录是否存在,不存在则创建的方法

    在Linux下 xff0c 检查一个目录是否存在 xff0c 不存在则创建的方法如下 xff0c 通过shell文件 if d dirname then mkdir dirname fi 这里判断名称dirname的目录是否存在 xff0c
  • 在Linux下打开一个新的终端运行程序的脚本

    在ROS程序中经常涉及到需要打开多个终端运行程序的情况 xff0c 通常ROS程序会包含多个节点 xff0c 而每个节点都需要在一个终端中运行 xff0c 在脚本中打开新的终端并在其中运行程序的方法如下 gnome terminal x b
  • ROS目录结构

    参考 xff1a https zhuanlan zhihu com p 139405796 ROS项目通常组织在一个catkin的workspace下面 xff0c 里面包含典型的文件和目录 xff0c 如下 如上图所示 xff0c 首先是
  • Linux下获得某个目录下最新生成的文件的方法

    在程序中需要对最新生成的文件进行处理 可以采用如下的脚本 filename 61 96 ls t dir head n1 awk 39 print 0 39 96 echo filename 返回的filename即为dir目录下最新生成的
  • Ubuntu安装OpenCV

    最近又需要安装OpenCV了 xff0c 真是躲不掉啊 xff0c 也说明了OpenCV的全面 xff0c 图像 视频处理都需要用到它 参考了https blog csdn net public669 article details 990
  • Ubuntu 18.04安装RealTek 8723DE网卡驱动

    台式机是RealTek 8723DE的无线网卡 xff0c 在Ubuntu 18 04下不能自动识别 xff0c 在电脑官网没有Linux的驱动 xff0c 在网上找了安装方法 xff0c 有些不能有效工作 xff0c 找到一个从GitHu
  • Ubuntu绕不开之ROS

    除了前面的OpenCV xff0c ROS也是Ubunt绕不开的软件 Ubuntu 18 04对应的ROS是melodic版本 xff0c 安装推荐参考官方教程 xff1a http wiki ros org melodic Install
  • Ubuntu 18.04之安装中文输入法

    Ubuntu 18 04在安装时可以选择中文界面安装 xff0c 这样会默认安装中文输入法 xff0c 不过这样生成的系统目录名称等都变成中文 xff0c 对于有些技术人员不是很习惯 xff0c 更喜欢安装英文的Ubuntu xff0c 然
  • MySQL视图Duplicate column name问题的解决

    本文将介绍MySQL view视图出现 Duplicate column name 问题的解决解决方法 xff0c 在这里 xff0c 我用的是SQLyog程序 xff0c 其实和在MySQL命令行打代码是一样的 xff0c 只不过用SQL
  • Linux下逐页翻看文件内容的方法

    Linux下用cat查看文件的话会全部打印出文件的所有内容 xff0c 用gedit查看的话可能会死机 xff08 当文件大于5M的时候 xff09 xff0c 用more命令可以逐页翻看需要查看的文件内容 xff0c 命令格式 more
  • Linux下搜索包含指定文字内容文件的方法(grep)

    用grep命令可以方便地在Linux系统下搜索包含指定文字内容的文件 grep r lt text to find gt lt dir gt 搜索指定目录 lt dir gt 下 xff0c 所有包含 lt text to find gt
  • Ubuntu设置登录自动启动程序的方法

    参考链接 xff1a https www cnblogs com the wang p 11230087 html 如上 xff0c 设置自动启动程序的方法有多种 xff0c 分别在系统启动的不同阶段启动 xff0c 在这里需要在用户登录图
  • Linux下脚本自动输入sudo密码的方法

    在设置自启动程序时 xff0c 希望可以自动输入sudo密码以运行一些需要超级用户权限的程序 xff0c 可以如下例子 echo 123456 sudo S apt get update 其中123456为sudo密码 xff0c sudo
  • Linux Shell脚本参数传递与条件判断的方法

    参考链接 xff1a https www runoob com linux linux shell html 参数传递 Shell脚本中参数用 来表示 xff0c 如 1 第一个参数 2 第二个参数 xff0c 以此类推 xff0c 比如t
  • Linux下C检测按键按下并即时反馈的方法(不需要回车)

    在Linux下检查按键按下并即时反馈的方法 xff0c 如下 include lt stdio h gt include lt termio h gt int main termios tms old tms new tcgetattr 0
  • Linux下C语言检测多个按键按下状态的方法

    在需要同时监听多个按键按下状态的情况下 xff0c 可以通过监听 dev input event事件的方法来判断按键的状态 比如对于通过键盘控制小车时 xff0c 有可能多个方向键同时按下 xff0c 需要同时监测到 xff0c 通过前面文