使用Ubuntu读取USB手柄/方向盘的输出控制

6 篇文章 0 订阅
6 篇文章 0 订阅

摘要:最近从淘宝购买了某通多模版蓝牙5.0的游戏手柄,使用官方的接收器,好用的不得了。实测无遮挡情况下距离40m,有遮挡情况下10m左右,顺便总结下测试方法。

1.cat命令

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

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

2.hexdump命令

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

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

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=045e Product=028e Version=0111
N: Name="Microsoft X-Box 360 pad"
P: Phys=usb-0000:03:00.0-2/input0
S: Sysfs=/devices/pci0000:00/0000:00:15.0/0000:03:00.0/usb3/3-2/3-2:1.0/input/input9
U: Uniq=
H: Handlers=event5 js0 
B: PROP=0
B: EV=20000b
B: KEY=7cdb000000000000 0 0 0 0
B: ABS=3003f
B: FF=107030000 0

在端口处找到设备名字“Microsoft X-Box 360 pad”,event5/js0 我们的手柄的接口。

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

查看输入

ls /dev/input

在这里插入图片描述
可以看见js0和event21,使用以下代码查看端口输出:

cat /dev/input/js0 | hexdump

cat /dev/input/event21 | hexdump

在这里插入图片描述
测试手柄命令

jstest /dev/input/js0

在这里插入图片描述

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 *

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
UbuntuUSB设备经常断开连接可能是由于多种原因导致的。其中一种常见的原因是与电脑设置有关。可以尝试以下步骤来解决这个问题: 1. 首先关闭Ubuntu,打开"我的电脑"->"管理"->"服务与应用程序"->"服务"。 2. 找到"VMware USB Arbitration Service"服务,将其改为自动并应用更改。 3. 重新打开Ubuntu设备,然后尝试连接USB设备。 另外,USB断开连接的问题也可能与蓝牙适配器有关。如果你使用的是蓝牙键盘或其他蓝牙设备,可以尝试以下方法解决问题: 1. 检查蓝牙适配器是否正常工作,确保它与电脑连接良好。 2. 重新配对蓝牙设备,删除旧的配对信息并重新进行配对。 3. 可以尝试更新蓝牙适配器的驱动程序,以确保其与Ubuntu系统兼容。 4. 如果仍然无法解决问题,可以尝试在Ubuntu系统的论坛或社区中寻求帮助,了解其他用户是否遇到过类似的问题,并寻找解决方案。 总之,如果UbuntuUSB设备经常断开连接,可以通过检查电脑设置、调整服务设置以及检查蓝牙适配器等方法来解决问题。如果问题仍然存在,建议咨询Ubuntu社区或论坛以获取更多专业的帮助和支持。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [解决Ubuntu问题之一二,Ubuntu不能连接USB设备,Ubuntu挂起唤醒后不能连接网络](https://blog.csdn.net/u010584870/article/details/123972056)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Ubuntu18.04 打不开系统蓝牙适配器,也连接不上任何蓝牙设备Bug解决方案](https://download.csdn.net/download/weixin_38646706/14052550)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RobotWoods

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值