libusb无法打开USB设备,权限不允许.NetBeans / Ubuntu



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

我认为最好的方法是为您的设备创建一个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规则的更多信息,请参阅本文。

我认为这可能是一个临时的解决方案,而Preston的解决方案将始终有效。

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端口所做的操作将重置。

你必须再重复一、二步。

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

进一步阅读

我觉得这两篇博客文章会有助于你的理解。

  • 文件目录权限入门指南
  • Unix LS命令:15个实用示例

将规则添加到/etc/udev/rules.d/后比如:

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

不要忘记重载规则:

$ sudo udevadm control --reload-rules

你可以在root用户模式下运行你的应用程序,然后去掉这个权限问题。但是,您应该意识到运行程序的后果在完全理解用户/组权限之前,不应该使用Root用户在UNIX系统上。然而,如果这是你的测试机器,我认为你可以做到下面(对于程序名。/a.t out):

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

现在你应该可以成功运行程序了。

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

对于你想要通信的每一个设备,你需要找到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/规则。D/' rules是在'/lib/udev/rules之后处理的。d/规则

举个例子,这对我的欧文斯示波器有效。我把这段文字放在目录"/lib/udev/rules.d/"下的一个名为"70-owon.rules"的文件中:

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

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

相关内容

  • 没有找到相关文章