C++ libusb无法打开USB设备,权限为。NetBeans/Ubuntu
我正在用NetBeans编写一个C/C++应用程序,它基于Ubuntu12.04上的libusb-1.0。 我可以从USB设备获取基本信息(例如,接口描述),但无法打开设备。 函数libusb_open给出了以下错误:C++ libusb无法打开USB设备,权限为。NetBeans/Ubuntu,c++,ubuntu-12.04,netbeans6.8,libusb-1.0,C++,Ubuntu 12.04,Netbeans6.8,Libusb 1.0,我正在用NetBeans编写一个C/C++应用程序,它基于Ubuntu12.04上的libusb-1.0。 我可以从USB设备获取基本信息(例如,接口描述),但无法打开设备。 函数libusb_open给出了以下错误: libusb:error [op_open] libusb couldn't open USB device /dev/bus/usb/002/003: Permission denied. libusb:error [op_open] libusb requires write
libusb:error [op_open] libusb couldn't open USB device /dev/bus/usb/002/003: Permission denied.
libusb:error [op_open] libusb requires write access to USB device nodes.
我知道我需要更改权限,但我不知道如何更改(我是一个非常基础的Linux用户)。谢谢大家! 您可以在root用户模式下运行您的应用程序,并获得该权限 问题但是,您应该了解在中运行程序的后果 root用户,在完全理解用户/组权限之前不应执行此操作 在基于UNIX的系统上。然而,如果它是你的测试机器,我认为你可以做的 以下内容(用于程序名。/a.out):
但是,如果要为特定用户提供/更改读/写/执行权限,则应尝试了解有关该命令的信息。必须将权限更改为目录(/dev/bus/usb/002/)以及此目录下的任何特定文件。希望此信息有用。我认为最好的方法是为您的设备创建一个udev规则文件。只需创建一个类似于
myVendor.rules
的文本文件名,并将以下文本放入其中(其中1234
是您的供应商ID:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", MODE="0666"
SUBSYSTEM=="usb_device", ATTRS{idVendor}=="1234", MODE="0666"
将此udev文件放在您的/etc/udev/rules.d/
目录中。此udev文件将授予所有用户(包括非特权用户)对所有具有匹配供应商ID的USB设备的读写访问权限。这意味着即使不修改可执行文件或使用sudo运行该文件,非root用户也可以访问您的设备
此udev示例特定于idVendor,但您可以将其限制为更严格的VID和PID。有关详细信息,请查看规则。我认为这可能是解决问题的临时方法,但会一直有效 1.检查为您的设备分配了哪个usb端口 通过两次调用
ls
命令(第一次是在设备断开连接的情况下,第二次是在设备连接的情况下),您可以确定为设备分配了哪个usb端口
您可以使用chmod
命令允许每个用户在特定设备上写入。使用chmod
命令时,您需要sudo
权限
$ sudo chmod o+w /dev/bus/usb/003/008
或
现在,如果你检查usb的权限,你必须看到这个输出
$ ls -l /dev/bus/usb/003/008
crw-rw-rw- 1 root root 189, 263 1월 10 15:42 /dev/bus/usb/003/008
3.每次拔出或关闭系统时,重复步骤1,2
如果您将设备从usb端口拔出或关闭系统,您对usb端口所做的操作将重置
您必须再次重复步骤1,2
这就是为什么我说我的解决方案是临时的(不稳定的)
进一步阅读
我发现这两篇博客文章有助于你的理解
/etc/udev/rules.d/
比如:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="1234", MODE="0666", OWNER="YOU_USER_ID"
不要忘记使用以下内容重新加载规则:
$ sudo udevadm control --reload-rules
对于要与之通信的每个设备,您都需要找到idVendor(如果需要,还需要idProduct)。这可以通过bash命令“lsusb”完成。您可以获得idVendor:idProduct对。示例:
pstallinga@mycomputer:~$ lsusb
Bus 002 Device 005: ID 5345:1234 Owon PDS6062T Oscilloscope
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 005: ID 046a:000c Cherry GmbH
Bus 001 Device 004: ID 0480:a006 Toshiba America Inc External Disk 1.5TB
Bus 001 Device 003: ID 046a:0023 Cherry GmbH Keyboard
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
然后为它创建一个规则。将规则放在以“.rules”结尾的文件中,并将该文件放在“/etc/udev/rules.d/”或“/lib/udev/rules.d/”目录中:
- 规则是按字母顺序处理的(因此70在60之后,以此类推)
- “/etc/udev/rules.d/”规则在“/lib/udev/rules.d/”规则之后处理
SUBSYSTEMS=="usb", ATTRS{idVendor}=="5345", ATTRS{idProduct}=="1234", MODE="0666"
我可以在我的C程序中与示波器通信。谢谢大家。我用不同的方法解决了问题,它也能正常工作。但我认为这是一个类似的解决方案。在终端中,我给出了:sudo su,而不是从终端运行netbeans(运行它的命令可以通过右键单击netbeans图标,然后单击“属性”>“命令”)在Netbeans中编译/执行不再是限制问题。也许其他人会发现它很有用谢谢你Preston。只有一个小问题,一旦我有了文本文件,我该如何告诉linux阅读规则?哎呀,对不起-我已经在答案中添加了这个,你会想把文件放在
/etc/udev/rules.d/
中。这对我不起作用直到我在设置模式值的位中添加了冒号:mode:=“0666”
。我还只需要usb线路,而不需要usb设备线路。我使用的是Debian 7.7。我发现它只有在对这些十六进制数使用小写时才起作用。有人知道为什么吗?
$ sudo udevadm control --reload-rules
pstallinga@mycomputer:~$ lsusb
Bus 002 Device 005: ID 5345:1234 Owon PDS6062T Oscilloscope
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 005: ID 046a:000c Cherry GmbH
Bus 001 Device 004: ID 0480:a006 Toshiba America Inc External Disk 1.5TB
Bus 001 Device 003: ID 046a:0023 Cherry GmbH Keyboard
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
SUBSYSTEMS=="usb", ATTRS{idVendor}=="5345", ATTRS{idProduct}=="1234", MODE="0666"