在不断开Linux的情况下软重置USB设备

问题描述

问题: 我有连接到远程linux机器的USB设备。我想使用文件描述符重置它们。

我使用/dev/usbTTYXX中的通用端口名称连接到端口。不幸的是,我很快发现这是一个不好的方法,因为它们是按顺序生成的。如果我先插入tty设备,它将生成ttyUSB0,如果我插入第二个tty设备,它将生成TTYUSB1,依此类推。不幸的是,我有太多不同的ttyUSB设备以及其他破坏该顺序的设备。简而言之,它只是用户不友好,是一场噩梦。我发现最好在/dev/serial/by-id中使用特定的simlink文件描述符打开端口。这是最好的选择,因为它们看起来非常独特,即使重新启动后也不会更改,即使插入了USB也可以重新启动。

所以我可以像这样以更可靠的方式打开端口。 (我什至为此拥有一个json)

// old
int serial_port = open("/dev/ttyUSB1",O_RDWR | O_NOCTTY);
// new
int serial_port = open("/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AC00MET6-if00-port0",O_RDWR | O_NOCTTY);

无论我重新连接多少,USB设备都不会更改(与/ dev / ttyUSB0不同)。无论如何,我发现此代码可能会对设备执行软重置,因此我无需将其重新插入。这是source

如果我使用此文件描述符/dev/bus/usb/001/010,它将起作用。 /dev/bus/usb/XXX/YYY,其中XXX是总线号(在Pi上几乎总是001),而YYY是设备号(都从lsusb获取这两个值)。同样,lsusb似乎也经常改变。 (更麻烦的是,我有类似的USB设备适配器,它们使用相同的产品和供应商ID!)

但是,如果我使用/dev/ttyUSB0或ID与/dev/serial/by-id/一起使用,它将不起作用。我得到的错误Error in ioctl: Inappropriate ioctl for device.

问题:如何在/ dev/serial/by-id/文件simlink中使用ioctrl USBDEVFS_RESET方法

/* usbreset -- send a USB port reset to a USB device */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>

#include <linux/usbdevice_fs.h>


int main(int argc,char **argv)
{
    const char *filename;
    int fd;
    int rc;

    if (argc != 2) {
        fprintf(stderr,"Usage: usbreset device-filename\n");
        return 1;
    }
    filename = argv[1];

    fd = open(filename,O_WRONLY);
    if (fd < 0) {
        perror("Error opening output file");
        return 1;
    }

    printf("Resetting USB device %s\n",filename);
    rc = ioctl(fd,USBDEVFS_RESET,0);  
    if (rc < 0) {
        perror("Error in ioctl");
        return 1;
    }

    printf("Reset successful\n");

    close(fd);
    return 0;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)