簡體   English   中英

libusb 無法打開 USB 設備,權限問題。 NetBeans/Ubuntu

[英]libusb cannot open USB device, permission isse. 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/目錄中。 對於所有具有匹配供應商 ID 的 USB 設備,此 udev 文件將授予所有用戶(包括非特權用戶)讀寫訪問權限。 這意味着即使不修改您的可執行文件或使用 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 端口所做的操作將重置。

您必須再次重復步驟 1,2。

這就是為什么我說我的解決方案是臨時的(易變的)。

進一步閱讀

我發現這兩篇博客文章對您的理解有所幫助。

那么您可以在 root 用戶模式下運行您的應用程序並擺脫權限問題。 但是,您應該了解以 root 用戶運行程序的后果,並且在您完全了解基於 UNIX 的系統上的用戶/組權限之前不應這樣做。 但是,如果它是您的測試機,我認為您可以執行以下操作(對於程序名稱 ./a.out):

  1. 打開終端
  2. 轉到您的程序可執行文件所在的目錄(檢查您的 netbeans 創建的項目並鍵入cd completepath )。
  3. sudo ./a.out
  4. 現在命令提示符會要求輸入 root 密碼

現在您應該能夠成功運行該程序。

但是,如果您想為特定用戶提供/更改讀/寫/執行權限,您應該嘗試了解chmod命令。 您必須更改目錄(/dev/bus/usb/002/)和駐留在此目錄下的任何特定文件的權限。 希望這些信息有用。

將規則添加到/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 程序中與示波器通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM