raf*_*184 5 c++ netbeans6.8 libusb-1.0 ubuntu-12.04
我正在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.
Run Code Online (Sandbox Code Playgroud)
我知道我需要更改权限,但我不知道如何(我是一个非常基本的Linux用户).谢谢!
Pre*_*ton 25
我认为最好的方法是为您的设备创建一个udev规则文件.只需创建一个类似的文本文件名,myVendor.rules并在其中放入以下文本(1234您的供应商ID 在哪里:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", MODE="0666"
SUBSYSTEM=="usb_device", ATTRS{idVendor}=="1234", MODE="0666"
Run Code Online (Sandbox Code Playgroud)
将此udev文件放在您的/etc/udev/rules.d/目录中.对于具有匹配供应商ID的所有USB设备,此udev文件将授予对所有用户(包括非特权用户)的读写访问权限.这意味着即使不修改可执行文件或使用sudo运行它,您的设备也可供非root用户访问.
此udev示例特定于idVendor,但您可以将其限制为VID,PID更严格.有关更多信息,请查看本文以编写udev规则.
我认为这可能是该问题的临时解决方案,而Preston的解决方案将始终如一地工作。
您可以通过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
Run Code Online (Sandbox Code Playgroud)
假设/ dev / bus / usb / 003/008是您的设备。
根据ls -l命令的输出,root用户(组)具有读/写权限,003/008 port而其他用户仅具有读权限。
crw-rw-r-- 1 root root 189, 263 1? 10 15:42 008
Run Code Online (Sandbox Code Playgroud)
您可以允许每个用户使用chmod命令在特定设备上进行写入。使用chmod命令时,您将需要sudo权限。
$ sudo chmod o+w /dev/bus/usb/003/008
Run Code Online (Sandbox Code Playgroud)
要么
$ sudo chmod a+w /dev/bus/usb/003/008
Run Code Online (Sandbox Code Playgroud)
现在,如果您检查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
Run Code Online (Sandbox Code Playgroud)
如果您从USB端口插入设备或关闭系统,则对USB端口所做的操作将重置。
您必须再次重复步骤1,2。
这就是为什么我说我的解决方案是临时的(易失性)。
我发现这两篇博客文章将有助于您的理解。
小智 6
添加规则后,/etc/udev/rules.d/
例如:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="1234", MODE="0666", OWNER="YOU_USER_ID"
Run Code Online (Sandbox Code Playgroud)
不要忘记使用以下命令重新加载规则:
$ sudo udevadm control --reload-rules
Run Code Online (Sandbox Code Playgroud)
对于您想要与之通信的每一件设备,您都需要找出 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
Run Code Online (Sandbox Code Playgroud)
然后为其创建规则。您放置在以“.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"
Run Code Online (Sandbox Code Playgroud)
我可以在我的 C 程序中与示波器进行通信。
那么您可以在 root 用户模式下运行您的应用程序并摆脱权限问题。但是,您应该了解以 root 用户运行该程序的后果,并且在您完全了解基于 UNIX 的系统上的用户/组权限之前不应这样做。但是,如果这是您的测试机,我认为您可以执行以下操作(对于程序名称./a.out):
cd completepath)。sudo ./a.out现在您应该能够成功运行该程序了。
但是,如果您想为特定用户提供/更改读/写/执行权限,您应该尝试了解chmod命令。您必须更改目录(/dev/bus/usb/002/)以及驻留在该目录下的任何特定文件的权限。希望这些信息会有用。