为什么在使用read()命令之前无法清除缓冲区? (Linux,evdev输入,读取,刷新)

时间:2019-01-10 17:15:33

标签: linux events input joystick evdev

请为我的英语不是我的母语而执行命令。

Linux输入设备:/ dev / input / event0或/ dev / input / by-id / usb-Logitech_G29_Driving_Force_Racing_Wheel-event-joystick

问题:我不想读取缓冲的数据。


尊敬的Stackoverflow

1-我在Linux上打开了一个输入设备。

2-我编写了一些代码以使设备向左或回到中心。 (这是游戏方向盘,因此当我打开应用程序时,必须确保方向盘位于中间)

3-我关闭了文件描述符并打开了完全相同的设备,以不读取旧的缓冲数据。

4-当我想获取具有读取功能的数据时,我正在获取旧的缓冲数据,该数据是在我将设备移至居中位置时得到的。 (当我想将轮子转到中心位置时,第一个位置为0,它从0变为35000)

那么,如何在不编写第二个应用程序的情况下清除缓冲的数据?因为如果我编写了两个应用程序,第一个应用程序将设备滚轮设置为居中,第二个应用程序用于获取数据,那么一切都很好。我的意思是,如果我关闭来自其他应用程序的文件描述符,则linux会清除数据,但是如果我在同一应用程序上尝试此操作,则会有缓冲区。

我尝试清除缓冲区的内容:

  • 首先,我尝试在Google上搜索stackoverflow并阅读几乎所有内容。
  • fsync()
  • fflush(stdin)和fflush(stdout)
  • ioctl(fd,I_FLUSH,FLUSHRW)
  • tcflush(fd,TCIOFLUSH)
  • 在读取前关闭(fd)。 (我认为是由于相同的应用程序,Linux为我提供了相同的文件描述符。如果我退出程序并再次运行,则没有缓冲区

$ gcc -o test_prog test.c && ./test_prog

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <termios.h>
#include <strings.h>
#include <stropts.h>

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

// set the wheel position to center of it
void set_autocenter(int fd, int autocenter) {
    struct input_event ie;

    ie.type = EV_FF;
    ie.code = FF_AUTOCENTER;
    ie.value = 0xFFFFUL * autocenter / 100;

    if (write(fd, &ie, sizeof(ie)) == -1) {
        perror("error set_auto_center");
    }
}

int main(int argc, char *argv[]) {
    int fd_joystick;
    struct input_event ev = {0};
    const char *device_wheel = "/dev/input/by-id/usb-Logitech_G29_Driving_Force_Racing_Wheel-event-joystick";

    if ((fd_joystick = open(device_wheel, O_RDWR)) < 0) {
        perror("device could't opened.");
        return 0;
    }

    set_autocenter(fd_joystick, 100);

    while (1) {

        /* Problem starts from here 
         * When I first call read function it gives me garbage data which gets from
         * function of set_autocenter. Because this function changes the direction of wheel
         */

        if ( read(fd_joystick, &ev, sizeof(struct input_event)) == sizeof(struct input_event)) {
            printf("Event Type: %d Event Code: %d Event Value: %d\n", ev.type, ev.code, ev.value);
        }
     }

     return 1;
}

$ cat / proc / bus / input / devices

I: Bus=0003 Vendor=046d Product=c24f Version=0111
N: Name="Logitech G29 Driving Force Racing Wheel"
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:046D:C24F.0040/input/input61
U: Uniq=
H: Handlers=event0 js0 
B: PROP=0
B: EV=20001b
B: KEY=1ff 0 0 0 0 0 0 ffff00000000 0 0 0 0
B: ABS=30027
B: MSC=10
B: FF=300040000 0

0 个答案:

没有答案