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语言检测多个按键按下状态的方法 的相关文章

  • 无法为 Python 3.4 创建工作虚拟环境

    I 安装Python 3 4 2 https docs python org 3 using unix html building python和我的 Linux Mint 17 1 中的 Virtualenv 12 0 5 然后我尝试创建
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • 在 Ubuntu 上纯粹通过 bash 脚本安装 mysql 5.7

    我想要一个无需任何手动输入即可安装 MySQL 5 7 实例的 bash 脚本 我正在关注数字海洋教程 https www digitalocean com community tutorials how to install mysql
  • 如何从“git log”中查看 Git 中的特定版本?

    My git log显示为 enter code here git trial git log commit 4c5bc66ae50780cf8dcaf032da98422aea6e2cf7 Author king lt email pro
  • 如何在 Linux 中使用单行命令获取 Java 版本

    我想通过单个命令获取 Linux 中的 Java 版本 我是 awk 的新手 所以我正在尝试类似的事情 java version awk print 3 但这不会返回版本 我将如何获取1 6 0 21从下面的Java版本输出 java ve
  • 如何使用ffmpeg重叠和合并多个音频文件?

    我正在尝试将多个音频文件合并到一个文件中 但我可以使用以下命令来连接 而不是连接 ffmpeg v debug i file1 wav i file2 wav i file3 wav filter complex 0 0 concat n
  • 远程linux服务器到远程linux服务器大型稀疏文件复制 - 如何?

    我有两台 CentOS 5 4 服务器 每台服务器上都安装了 VMware Server 假设我始终对 vmware 虚拟机使用稀疏文件 将虚拟机文件从一台服务器复制到另一台服务器的最可靠 最快速的方法是什么 虚拟机的文件复制起来很痛苦 因
  • Linux 文本文件操作

    我有一个格式的文件 a href a href a href a href 我需要选择 之后但 之前的文本 并将其打印在行尾 添加后 例如 a href http www wowhead com search Su a a a a a
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • 如何成功使用RDAP协议代替whois

    我对新的 RDAP 协议有点困惑 也不知道何时进一步追求它有意义 在我看来 每个人都同意它是 whois 的继承者 但他们的数据库似乎是空的 在 ubuntu 上我尝试了 rdapper nicinfo 甚至他们的 RESTful API
  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • InstaPy:“错误,无法确定 64 位 Linux 的正确文件名”

    有人知道如何解决或解决这个问题吗 来自控制台的堆栈跟踪 执行后报告错误 InstaPy Version 0 6 9 Workspace in use home zanettra InstaPy Error unable to determi
  • 如何让 clangd 转向 c++20

    当没有其他信息时 如何让 clangd 回退到 c 20 例如 在第一次构建之前 cmake 可以生成一个 这是在带有最新 LLVM 的 Arch Linux 上 这是通过 Emacs LSP 运行的 但这应该没有什么区别 你可以加 Com
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显

随机推荐

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

    由于无人机在飞行过程中受到电机桨叶转动的引起的振动影响 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 通过前面文