libusb无法打开USB设备,权限是。 NetBeans的/ Ubuntu的

时间:2014-03-28 13:10:03

标签: c++ ubuntu-12.04 netbeans6.8 libusb-1.0

我在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用户)。谢谢!

5 个答案:

答案 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可以保持一致。

1。检查为您的设备分配了哪个USB端口

您可以通过两次调用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 是您的设备。

2。为每个人(其他)提供写入权限

根据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

3。每次插拔或关闭系统重复步骤1,2

如果您从USB端口插入设备或关闭系统,您为usb端口所做的操作将会重置。

您必须重复步骤1,2。

这就是为什么我说我的解决方案是暂时的(易变的)。

进一步阅读

我发现这两篇博客文章对您的理解有所帮助。

答案 2 :(得分:3)

您可以在root用户模式下运行应用程序并获取权限 问题。但是,您应该了解运行该程序的后果 root用户,在完全理解用户/组权限之前不应该这样做 在基于UNIX的系统上。但是,如果它是你的测试机器,我认为你可以做到 以下(对于程序名称./a.out):

  1. 打开终端
  2. 转到程序可执行文件所在的目录(检查netbeans是否创建项目并输入cd“completepath”。
  3. sudo ./a.out
  4. 现在命令提示符将要求输入root密码
  5. 现在您应该能够成功运行该程序。

    但是,如果要为特定用户提供/更改读/写/执行权限,则应尝试了解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/'目录中:

  • 规则按字母顺序处理(因此70排在60之后,依此类推)
  • '/ 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程序中与示波器进行通信。