libusb 无法打开 USB 设备,权限问题。 NetBeans/Ubuntu

问题描述 投票:0回答:5

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

c++ ubuntu-12.04 netbeans6.8 libusb-1.0
5个回答
40
投票

我认为最好的方法是为您的设备创建一个 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 以更加严格。查看这篇关于编写 udev 规则的文章以获取更多信息。


11
投票

我认为这可能是问题的临时解决方案,而普雷斯顿的解决方案将始终有效。

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

您可以通过调用

ls
命令两次(第一次是设备 disconnected,第二次是设备 connected)来确定为您的设备分配了哪个 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。

这就是为什么我说我的解决方案是暂时的(不稳定的)。

进一步阅读

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


6
投票

将规则添加到

/etc/udev/rules.d/
后 像这样的东西:

SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="1234", MODE="0666", OWNER="YOU_USER_ID"

不要忘记重新加载规则:

$ sudo udevadm control --reload-rules

6
投票

对于您想要与之通信的每台设备,您都需要找出

idVendor
(如果需要,还可以找到
idProduct
)。您可以通过 bash 命令
lsusb
来完成此操作。您将获得
idVendor:idProduct
对。示例:

$ 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 示波器有效。我将此文本放入目录

70-owon.rules
中名为
/lib/udev/rules.d/
的文件中:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="5345", ATTRS{idProduct}=="1234", MODE="0666"

我可以在我的 C 程序中与示波器进行通信。


4
投票

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

  1. 打开终端
  2. 转到程序可执行文件所在的目录(检查您的 netbeans 创建项目并输入
    cd completepath
    )。
  3. sudo ./a.out
  4. 现在命令提示符会要求输入 root 密码

现在你应该能够成功运行程序了。

但是,如果您想为特定用户提供/更改读/写/执行权限,您应该尝试了解 chmod 命令。您必须更改目录(/dev/bus/usb/002/)以及驻留在该目录下的任何特定文件的权限。希望这些信息有用。

© www.soinside.com 2019 - 2024. All rights reserved.