Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ libusb无法打开USB设备,权限为。NetBeans/Ubuntu_C++_Ubuntu 12.04_Netbeans6.8_Libusb 1.0 - Fatal编程技术网

C++ libusb无法打开USB设备,权限为。NetBeans/Ubuntu

C++ libusb无法打开USB设备,权限为。NetBeans/Ubuntu,c++,ubuntu-12.04,netbeans6.8,libusb-1.0,C++,Ubuntu 12.04,Netbeans6.8,Libusb 1.0,我正在用NetBeans编写一个C/C++应用程序,它基于Ubuntu12.04上的libusb-1.0。 我可以从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

我正在用NetBeans编写一个C/C++应用程序,它基于Ubuntu12.04上的libusb-1.0。 我可以从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用户)。谢谢大家!

您可以在root用户模式下运行您的应用程序,并获得该权限 问题但是,您应该了解在中运行程序的后果 root用户,在完全理解用户/组权限之前不应执行此操作 在基于UNIX的系统上。然而,如果它是你的测试机器,我认为你可以做的 以下内容(用于程序名。/a.out):

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


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

    我认为最好的方法是为您的设备创建一个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。有关详细信息,请查看规则。

    我认为这可能是解决问题的临时方法,但会一直有效

    1.检查为您的设备分配了哪个usb端口 通过两次调用
    ls
    命令(第一次是在设备断开连接的情况下,第二次是在设备连接的情况下),您可以确定为设备分配了哪个usb端口

    您可以使用
    chmod
    命令允许每个用户在特定设备上写入。使用
    chmod
    命令时,您需要
    sudo
    权限

    $ sudo chmod o+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

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

    进一步阅读 我发现这两篇博客文章有助于你的理解


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

    SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="1234", MODE="0666", OWNER="YOU_USER_ID"
    
    不要忘记使用以下内容重新加载规则:

    $ sudo udevadm control --reload-rules
    

    对于要与之通信的每个设备,您都需要找到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程序中与示波器通信。

    谢谢大家。我用不同的方法解决了问题,它也能正常工作。但我认为这是一个类似的解决方案。在终端中,我给出了:sudo su,而不是从终端运行netbeans(运行它的命令可以通过右键单击netbeans图标,然后单击“属性”>“命令”)在Netbeans中编译/执行不再是限制问题。也许其他人会发现它很有用谢谢你Preston。只有一个小问题,一旦我有了文本文件,我该如何告诉linux阅读规则?哎呀,对不起-我已经在答案中添加了这个,你会想把文件放在
    /etc/udev/rules.d/
    中。这对我不起作用直到我在设置模式值的位中添加了冒号:
    mode:=“0666”
    。我还只需要usb线路,而不需要usb设备线路。我使用的是Debian 7.7。我发现它只有在对这些十六进制数使用小写时才起作用。有人知道为什么吗?
    $ sudo udevadm control --reload-rules
    
    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
    
    SUBSYSTEMS=="usb", ATTRS{idVendor}=="5345", ATTRS{idProduct}=="1234", MODE="0666"