我正在基于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):
- 打开终端
- 进入你的程序可执行文件所在的目录(检查你的netbeans创建项目并输入
cd completepath
)。 -
sudo ./a.out
- 现在命令提示符会要求输入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程序中与示波器通信。