我在Ubuntu 12.04上基于libusb-1.0在NetBeans中编写C / C ++应用程序。 我可以从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 access to USB device nodes.
我知道我需要更改权限,但我不知道如何(我是一个非常基本的Linux用户)。谢谢!
答案 0 :(得分:22)
我认为最好的方法是为您的设备创建一个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/
目录中。对于具有匹配供应商ID的所有USB设备,此udev文件将授予对所有用户(包括非特权用户)的读写访问权限。这意味着即使不修改可执行文件或使用sudo运行它,您的设备也可供非root用户访问。
此udev示例特定于idVendor,但您可以将其限制为VID,PID更严格。查看this article for writing udev规则以获取更多信息。
答案 1 :(得分:5)
我认为这可能是问题的临时解决方案,而Preston's solution可以保持一致。
您可以通过两次调用ls
命令来确定为您的设备分配了哪个USB端口(首先设备已断开连接,第二次设备已连接) 。
$ ls -l /dev/bus/usb/00*
/dev/bus/usb/001:
total 0
crw-rw-r-- 1 root root 189, 0 1월 10 12:08 001
crw-rw-r-- 1 root root 189, 1 1월 10 12:08 002
/dev/bus/usb/002:
total 0
crw-rw-r-- 1 root root 189, 128 1월 10 12:08 001
crw-rw-r-- 1 root root 189, 129 1월 10 12:08 002
/dev/bus/usb/003:
total 0
crw-rw-r-- 1 root root 189, 256 1월 10 12:08 001
crw-rw-r-- 1 root root 189, 257 1월 10 12:08 002
crw-rw-r-- 1 root root 189, 258 1월 10 12:08 003
crw-rw-r-- 1 root root 189, 259 1월 10 12:08 004
crw-rw-r-- 1 root root 189, 260 1월 10 12:08 005
crw-rw-r-- 1 root root 189, 263 1월 10 15:42 008 <-- this is your device
让我们说 / dev / bus / usb / 003/008 是您的设备。
根据ls -l
命令的输出, root用户(组)对003/008 port
具有读/写权限,而其他用户仅具有读/写权限阅读许可。
crw-rw-r-- 1 root root 189, 263 1월 10 15:42 008
您可以允许每个用户使用chmod
命令在特定设备上进行写入。使用chmod
命令时,您需要sudo
权限。
$ sudo chmod o+w /dev/bus/usb/003/008
或
$ sudo chmod a+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
如果您从USB端口插入设备或关闭系统,您为usb端口所做的操作将会重置。
您必须重复步骤1,2。
这就是为什么我说我的解决方案是暂时的(易变的)。
我发现这两篇博客文章对您的理解有所帮助。
答案 2 :(得分:3)
您可以在root用户模式下运行应用程序并获取权限 问题。但是,您应该了解运行该程序的后果 root用户,在完全理解用户/组权限之前不应该这样做 在基于UNIX的系统上。但是,如果它是你的测试机器,我认为你可以做到 以下(对于程序名称./a.out):
现在您应该能够成功运行该程序。
但是,如果要为特定用户提供/更改读/写/执行权限,则应尝试了解chmod命令。您必须将权限更改为目录(/ dev / bus / usb / 002 /)以及驻留在此目录下的任何特定文件。希望这些信息有用。
答案 3 :(得分:2)
将规则添加到/etc/udev/rules.d/
后
类似的东西:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="1234", MODE="0666", OWNER="YOU_USER_ID"
不要忘记用以下内容重新加载规则:
$ sudo udevadm control --reload-rules
答案 4 :(得分:0)
对于要与之通信的每台设备,都需要找到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/'目录中:
举个例子,这对我的Owon示波器很有效。我将此文本放在目录“ /lib/udev/rules.d/”中名为“ 70-owon.rules”的文件中:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="5345", ATTRS{idProduct}=="1234", MODE="0666"
我可以在C程序中与示波器进行通信。