Ubuntu下读取Xbox360手柄输出

摘要:在淘宝上买到的游戏手柄/USB卖家只给了Windows下的驱动,本来以为Ubuntu下没有驱动,没想到网上早已经有人用cpp开发出了USB手柄的驱动,搜索很多博客的方法终于从手柄拿到数据。
Linux真给力!!

目录

  • 目录
  • 1.cat命令
  • 2.hexdump命令
  • 3.获取游戏手柄的端口输出
    • (1)获取端口
    • (2)读取游戏手柄端口数据
  • 4.代码实现
    • warning:deprecated conversion from string constant to ‘char *’
  • 主要参考

1.cat命令

cat 是一个文本文件查看和连接工具。查看一个文件的内容,用cat比较简单,就是cat 后面直接接文件名,如cat linuxyw.txt

cat –help可以查看cat帮助信息,如各种参数使用方法,当然也可以用man cat来查看,建议大家养成遇到命令不懂用法时,用–help或man来查看帮助信息,养成好习惯。filename为文件名,即系统中需要查看的文件名字。
与这个命令相似功能的命令有:tac,less,tail,more

options:
-b:--number-nonblank 对非空输出行编号,即在每行前显示所在行号
-n:--number 对输出的所有行编号,即在每行前显示所在行号

注:cat命令

2.hexdump命令

hexdump命令一般用来查看“二进制”文件的十六进制编码,但实际上它能查看任何文件,而不只限于二进制文件。

hexdump [选项] [文件]...
options:
-n length 只格式化输入文件的前length个字节。
-C 输出规范的十六进制和ASCII码。
-b 单字节八进制显示。
-c 单字节字符显示。
-d 双字节十进制显示。
-o 双字节八进制显示。
-x 双字节十六进制显示。
-s 从偏移量开始输出。
-e 指定格式字符串,格式字符串包含在一对单引号中,格式字符串形如:'a/b "format1" "format2"'。

注:hexdump命令

3.获取游戏手柄的端口输出

(1)获取端口

在插入设备时,linux系统会使用input子系统,操作系统会为每一个设备分配event号,先插上的为event0,后插上的为event1,首先获取linux系统为游戏手柄分配的event号。
当游戏手柄插入电脑时,需要找到手柄的even号:

cat /proc/bus/input/devices

注:或者可以使用>将输出写入一个txt文档

cat /proc/bus/input/devices >log1.txt

获得如下输出

I: Bus=0003 Vendor=11ff Product=001c Version=0111
N: Name="PXN-V3II"
P: Phys=usb-0000:00:14.0-11/input0
S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/0003:11FF:001C.0009/input/input29
U: Uniq=
H: Handlers=event21 js0
B: PROP=0
B: EV=1b
B: KEY=1fff000000000000 0 0 0 0
B: ABS=30027
B: MSC=10

在端口处找到设备名字“PXN-V3II”,event21/js0我们的手柄的接口。

开始的时候有时候找不到,是手柄中的版本不对,根据产品说明书需要由X-input转换到D-input模式。(长按home键3秒)
X -input适用于XBOX360移植到PC上的即插即玩的游戏,D-input适用于早期单机游戏如极品飞车1-12等。——要不是要在unbuntu下开发哪来这么多幺蛾子。。。

(2)读取游戏手柄端口数据

查看输入

ls /dev/input

可以看见js0和event21,使用以下代码查看端口输出:

cat /dev/input/js0 | hexdump

cat /dev/input/event21 | hexdump

得到一堆16进制的数,当手柄按下时,数字便会变化。

测试手柄命令

 jstest /dev/input/js0

可以读取Axes和Button的变化。

4.代码实现

参照参考3,新建文件夹与cpp文件,实现jstest功能:
cpp文件建立执行参照

gedit first.cpp
g++ first.cpp -o test
./test

代码如下:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
#include <linux/joystick.h>  #define XBOX_TYPE_BUTTON    0x01
#define XBOX_TYPE_AXIS      0x02  #define XBOX_BUTTON_A       0x00
#define XBOX_BUTTON_B       0x01
#define XBOX_BUTTON_X       0x02
#define XBOX_BUTTON_Y       0x03
#define XBOX_BUTTON_LB      0x04
#define XBOX_BUTTON_RB      0x05
#define XBOX_BUTTON_START   0x06
#define XBOX_BUTTON_BACK    0x07
#define XBOX_BUTTON_HOME    0x08
#define XBOX_BUTTON_LO      0x09    /* 左摇杆按键 */
#define XBOX_BUTTON_RO      0x0a    /* 右摇杆按键 */  #define XBOX_BUTTON_ON      0x01
#define XBOX_BUTTON_OFF     0x00  #define XBOX_AXIS_LX        0x00    /* 左摇杆X轴 */
#define XBOX_AXIS_LY        0x01    /* 左摇杆Y轴 */
#define XBOX_AXIS_RX        0x03    /* 右摇杆X轴 */
#define XBOX_AXIS_RY        0x04    /* 右摇杆Y轴 */
#define XBOX_AXIS_LT        0x02
#define XBOX_AXIS_RT        0x05
#define XBOX_AXIS_XX        0x06    /* 方向键X轴 */
#define XBOX_AXIS_YY        0x07    /* 方向键Y轴 */  #define XBOX_AXIS_VAL_UP        -32767
#define XBOX_AXIS_VAL_DOWN      32767
#define XBOX_AXIS_VAL_LEFT      -32767
#define XBOX_AXIS_VAL_RIGHT     32767  #define XBOX_AXIS_VAL_MIN       -32767
#define XBOX_AXIS_VAL_MAX       32767
#define XBOX_AXIS_VAL_MID       0x00  typedef struct xbox_map
{  int     time;  int     a;  int     b;  int     x;  int     y;  int     lb;  int     rb;  int     start;  int     back;  int     home;  int     lo;  int     ro;  int     lx;  int     ly;  int     rx;  int     ry;  int     lt;  int     rt;  int     xx;  int     yy;  }xbox_map_t;  int xbox_open(const char *file_name)
{  int xbox_fd;  xbox_fd = open(file_name, O_RDONLY);  if (xbox_fd < 0)  {  perror("open");  return -1;  }  return xbox_fd;
}  int xbox_map_read(int xbox_fd, xbox_map_t *map)
{  int len, type, number, value;  struct js_event js;  len = read(xbox_fd, &js, sizeof(struct js_event));  if (len < 0)  {  perror("read");  return -1;  }  type = js.type;  number = js.number;  value = js.value;  map->time = js.time;  if (type == JS_EVENT_BUTTON)  {  switch (number)  {  case XBOX_BUTTON_A:  map->a = value;  break;  case XBOX_BUTTON_B:  map->b = value;  break;  case XBOX_BUTTON_X:  map->x = value;  break;  case XBOX_BUTTON_Y:  map->y = value;  break;  case XBOX_BUTTON_LB:  map->lb = value;  break;  case XBOX_BUTTON_RB:  map->rb = value;  break;  case XBOX_BUTTON_START:  map->start = value;  break;  case XBOX_BUTTON_BACK:  map->back = value;  break;  case XBOX_BUTTON_HOME:  map->home = value;  break;  case XBOX_BUTTON_LO:  map->lo = value;  break;  case XBOX_BUTTON_RO:  map->ro = value;  break;  default:  break;  }  }  else if (type == JS_EVENT_AXIS)  {  switch(number)  {  case XBOX_AXIS_LX:  map->lx = value;  break;  case XBOX_AXIS_LY:  map->ly = value;  break;  case XBOX_AXIS_RX:  map->rx = value;  break;  case XBOX_AXIS_RY:  map->ry = value;  break;  case XBOX_AXIS_LT:  map->lt = value;  break;  case XBOX_AXIS_RT:  map->rt = value;  break;  case XBOX_AXIS_XX:  map->xx = value;  break;  case XBOX_AXIS_YY:  map->yy = value;  break;  default:  break;  }  }  else  {  /* Init do nothing */  }  return len;
}  void xbox_close(int xbox_fd)
{  close(xbox_fd);  return;
}  int main(void)
{  int xbox_fd ;  xbox_map_t map;  int len, type;  int axis_value, button_value;  int number_of_axis, number_of_buttons ;  memset(&map, 0, sizeof(xbox_map_t));  xbox_fd = xbox_open("/dev/input/js0");  if(xbox_fd < 0)  {  return -1;  }  while(1)  {  len = xbox_map_read(xbox_fd, &map);  if (len < 0)  {  usleep(10*1000);  continue;  }  printf("\rTime:%8d A:%d B:%d X:%d Y:%d LB:%d RB:%d start:%d back:%d home:%d LO:%d RO:%d XX:%-6d YY:%-6d LX:%-6d LY:%-6d RX:%-6d RY:%-6d LT:%-6d RT:%-6d",  map.time, map.a, map.b, map.x, map.y, map.lb, map.rb, map.start, map.back, map.home, map.lo, map.ro,  map.xx, map.yy, map.lx, map.ly, map.rx, map.ry, map.lt, map.rt);  fflush(stdout);  }  xbox_close(xbox_fd);  return 0;
}

运行结果如图:

可以从代码中获取各个键及方向盘的值~

如果代码报错:

warning:deprecated conversion from string constant to ‘char *’

解决方案:比较合理的办法是把参数类型修改为const char *
参考:https://blog.csdn.net/xyy410874116/article/details/6397549

主要参考

1.ubuntu下使用USB手柄
2.在UBUNTU中使用北通USB游戏手柄
3.Linux获取/dev/input目录下的event对应的设备
4.树莓派 使用xbox360手柄

Ubuntu下读取Xbox360手柄输出相关推荐

  1. Ubuntu下读取CHUSEI 3D Webcam 双目摄像头C++版本(调用python脚本进行配置)

    本博客做了一个工作--Ubuntu下用OpenCV读取CHUSEI 3D Webcam 双目摄像头(C++版本),希望能给予有需要的朋友一个参考. 购买了CHUSEI 3D Webcam 双目摄像头问 ...

  2. ubuntu下使用HDMI时输出无声音的解决方法

    这个问题碰到几次了,第一次是刚给显示器接用HDMI线的时候,后来给Ubuntu更新内核后又碰到了,特此记录一下 使用HDMI会默认将视频和声音都由其输出,然后声音经由HDMI线从主机直接走到显示器后出 ...

  3. [joysticker]使用Ubuntu读取USB手柄/方向盘的输出控制

    摘要:在淘宝上买到的游戏手柄/USB卖家只给了Windows下的驱动,本来以为Ubuntu下没有驱动,没想到网上早已经有人用cpp开发出了USB手柄的驱动,搜索很多博客的方法终于从手柄拿到数据. Li ...

  4. xbox one无线手柄在ubuntu下的对接开发

    在ubuntu1604/2004环境下实现xbox one无线手柄遥+usb无线适配器控机器人运动. 1. 安装xboxdrv和joystick sudo apt install xboxdrv su ...

  5. Ubuntu下使用Anaconda安装opencv 解决无法读取视频

    Ubuntu下使用Anaconda安装opencv 最近在Ubuntu16.04下使用Anaconda安装opencv,碰到很多坑,记录备忘. cv2.VideoCapture(filename) 返 ...

  6. Ubuntu下常用但是我容易忘记的命令总结(未完待续)

    写在前面的话 这个主要是写给自己看的,还是用的少了,哎,弱啊. 1.文件的归档处理 1.1 zip命令和unzip命令 zip 命令: $ zip test.zip test.txt 它会将 test ...

  7. Ubuntu下使用GDB断点Go程序

    大家好,今天为大家带来Ubuntu下,使用GDB断点调试Go程序.由于之前没有接触过GDB调试,而Go语言本身内置也没有什么调试工具,不像Eralng,有Debugger可以使用,我从网上搜索了下,也 ...

  8. ubuntu下搭建一个数据化处理的开发环境

    1.搭建matplotlib环境 构建matplotlib运行环境,需要满足相关软件环境. numpy库提供大数据集的数据的数据结构和数学方法.诸如元组.列表或字典等python的默认数据结构同样可以 ...

  9. ubuntu下minicom的安装及使用

    安装: sudo apt-get install minicom 配置: 1 . 在终端中输入minicom以启动minicom: 2. 先按下Ctrl + a, 放开, 再按o, 出现配置菜单. 3 ...

  10. 街机linux有安卓好吗,Ubuntu下用xmame玩街机游戏

    Ubuntu下用xmame玩街机游戏 xmame是Windows下mame的Linux版,gxmame是xmame的图形化前端.mame号称是模拟效果最好.支持roms最多的模拟器,不过这个我就不清楚 ...

最新文章

  1. 几种常用 JSON 库性能比较
  2. 2.RabbitMq-持久化
  3. php header功能的使用
  4. Cortana小娜:城市信息提醒
  5. python:将32位的16进制数据以二进制/hex/binary的形式写入到文件
  6. 深度学习之卷积神经网络(1)什么是卷积
  7. IntentService用法
  8. 推荐程序员的求爱技巧
  9. 架构设计(3)---基于Nginx和Zookeeper实现Dubbo的分布式服务
  10. Solrflux源码分析-Sql Support within Solr-类Sql的solr搜索实现(2)
  11. java对象复制_Java对象的深层复制与浅层复制
  12. Benefits of 3D CAD Modeling for Today’s Mechanical Engineer
  13. 2021新款外卖返利系统源码,美团/饿了么返利三级分销源码,PHP外卖返利源码下载
  14. 游戏测试基础:适配性测试
  15. 软件测试的需求人才越来越多,为什么大家还是不太愿意走软件测试的道路?
  16. 【C语言及程序设计】项目1-4-2-4:计算圆柱体表面积
  17. dos2unix 解决脚本执行过程中的莫名错误 “not found”
  18. Android-----将 Ijkplayer 集成到Android Studio中(一)
  19. 交通违章查询接口代码示例
  20. Scikit learn:machine learning in Python之贝叶斯学习

热门文章

  1. 王道考研数据结构之------循环单链表
  2. 有趣的硬币 java_有趣的硬币作文
  3. 手把手带你Yolov5 (v6.x)添加注意力机制(一)(并附上30多种顶会Attention原理图)(新增8种)
  4. 《领导力21法则》读书感悟
  5. 使用Hbase Shell和Java API分别进行Hbase的增删改查操作
  6. Qt制作透明背景图片与裁剪图片
  7. “信用租车”来了 芝麻分满650可在飞猪免押租车
  8. fastq质量值_fastq碱基质量值转化
  9. 私网ip和公网ip_详解
  10. 羊哥推荐的Java后端开发书籍