问题描述
问题: 我有连接到远程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 (将#修改为@)