[英]Libusb - ubuntu - Psoc5. libusb_open_device_with_vid_pid return 0
[英]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 的解決方案將始終如一地工作。
您可以通過兩次調用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是您的設備。
根據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
如果您將設備從 USB 端口拔出或關閉系統,您對 USB 端口所做的操作將重置。
您必須再次重復步驟 1,2。
這就是為什么我說我的解決方案是臨時的(易變的)。
我發現這兩篇博客文章對您的理解有所幫助。
那么您可以在 root 用戶模式下運行您的應用程序並擺脫權限問題。 但是,您應該了解以 root 用戶運行程序的后果,並且在您完全了解基於 UNIX 的系統上的用戶/組權限之前不應這樣做。 但是,如果它是您的測試機,我認為您可以執行以下操作(對於程序名稱 ./a.out):
cd completepath
)。sudo ./a.out
現在您應該能夠成功運行該程序。
但是,如果您想為特定用戶提供/更改讀/寫/執行權限,您應該嘗試了解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/”目錄中:
舉個例子,這對我來說適用於 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.