尽管我处于拨出状态,但没有权限访问位于 /dev/ttyUSB0 中的 USB 设备

尽管我处于拨出状态,但没有权限访问位于 /dev/ttyUSB0 中的 USB 设备

Ubuntu 14.04 问题:看来我没有权限访问 ttyUSB0 我已经在拨出组内。(已退出并重新登录)

ammirato@bvision4:/dev$ chmod 666 ttyUSB0 
chmod: changing permissions of 'ttyUSB0': Operation not permitted
ammirato@bvision4:/dev$ groups
compsci adm dialout sudo video groups: cannot find name for group ID 1096176595
109617659

即使在我更改权限后,sudo我仍然无法从我的帐户访问它。

ammirato@bvision4:/dev$ sudo chmod 666 ttyUSB0 
ammirato@bvision4:/dev$ ls -l ttyUSB0 
crw-rw-rw- 1 root dialout 188, 0 May 15 16:15 ttyUSB0
ammirato@bvision4:/dev$ chmod 666 ttyUSB0
chmod: changing permissions of 'ttyUSB0': Operation not permitted

更大的问题:

我正在尝试运行一些通过 USB 与机器人通信的 Aria 代码。我以前运行过它,一切正常。由于某种原因,它不再起作用了。使用 sudo 或不使用 sudo 运行该程序都没有帮助。该程序尝试通过 ttyS0 访问机器人,但我创建了一个从 ttyUSB0 到 ttyS0 的符号链接。

我也尝试过通过 ROS 运行 Aria 代码,它尝试通过 ttyUSB0 连接,但仍然无法连接。

如果我连接了 USB 设备或者没有连接,我的代码中会有不同的输出,所以我认为它可以检测到该设备,但可能没有读/写的权限,

已连接设备:

ammirato@bvision4:/dev$ rosrun rosaria RosAria
[ INFO] [1431722006.042624050]: RosAria: using port: [/dev/ttyUSB0]
Could not connect to simulator, connecting to robot through serial port /dev/ttyUSB0.
Syncing 0
No packet.
Syncing 0
No packet.
Trying to close possible old connection
Syncing 0
No packet.
Syncing 0
No packet.
 Robot may be connected but not open, trying to dislodge.
Syncing 0
No packet.
 Robot may be connected but not open, trying to dislodge.
Syncing 0
No packet.
Could not connect, no robot responding.
Failed to connect to robot.
[ERROR] [1431722012.788049009]: RosAria: ARIA could not connect to robot! (Check ~port parameter is correct, and permissions on port device.)
[FATAL] [1431722012.788127232]: RosAria: ROS node setup failed..

设备未连接:

ammirato@bvision4:/dev$ rosrun rosaria RosAria
[ INFO] [1431722075.336807723]: RosAria: using port: [/dev/ttyUSB0]
Could not connect to simulator, connecting to robot through serial port /dev/ttyUSB0.
ArSerialConnection::open: Could not open serial port '/dev/ttyUSB0' | ErrorFromOSNum: 2 ErrorFromOSString: No such file or directory
Could not connect, because open on the device connection failed.
Failed to connect to robot.
[ERROR] [1431722075.385556969]: RosAria: ARIA could not connect to robot! (Check ~port parameter is correct, and permissions on port device.)
[FATAL] [1431722075.385627788]: RosAria: ROS node setup failed... 

我正在使用 Ubuntu 14.04

ammirato@bvision4:/dev$ stat /dev/ttyUSB0
  File: '/dev/ttyUSB0'
  Size: 0           Blocks: 0          IO Block: 4096   character special file
Device: 5h/5d   Inode: 290088      Links: 1     Device type: bc,0
Access: (0660/crw-rw----)  Uid: (    0/    root)   Gid: (   20/ dialout)
Access: 2015-05-15 21:52:26.118904498 -0400
Modify: 2015-05-15 21:52:26.118904498 -0400
Change: 2015-05-15 21:52:26.118904498 -0400
 Birth: -

答案1

由于您不是此设备的所有者,因此您无法以普通用户身份更改此文件的权限。这没什么不寻常的。

关于将 /dev/ttyUSB0 符号链接到 /dev/ttyS0 - 我认为这是个坏主意。除非您有尝试使用该端口的程序的源代码,否则您真的不知道开发人员如何检查串行端口的设备节点。也许它检查该设备是字符设备(符号链接不满足此条件)然后失败?

我始终更喜欢使用程序命令行标志来指定端口,而不是使用诸如符号链接之类的解决方法。

ArSerialConnection::open: Could not open serial port '/dev/ttyUSB0' | ErrorFromOSNum: 2 ErrorFromOSString: No such file or directory
Could not connect, because open on the device connection failed.

stat /dev/ttyUSB0运行此命令时的输出是什么?

另外 - 将您的常规用户帐户添加到dialout组后,您是否注销然后重新登录?

答案2

假设您的权限正确:

$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 Okt 28 04:09 /dev/ttyUSB0
$ id
uid=1000(you) ... 20(dialout)

看来软件有问题。我今天也遇到了同样的问题。以下命令显示问题出在其他地方:

strace -ff igotugui >strace.txt 2>&1

然后,在 strace.txt 中我发现了类似的行(顺便说一下,对于所有现有设备):

[pid 13391] openat(AT_FDCWD, "/dev/bus/usb/004/001", O_RDWR) = -1 EACCES (Permission denied)
[pid 13391] ioctl(28, USBDEVFS_CONNECTINFO, 0x7f4efa5c6a58) = -1 EPERM (Operation not permitted)
[pid 13391] openat(AT_FDCWD, "/dev/bus/usb/003/010", O_RDWR) = -1 EACCES (Permission denied)
[pid 13391] ioctl(28, USBDEVFS_CONNECTINFO, 0x7f4efa5c6a58) = -1 EPERM (Operation not permitted)

目前,我不知道如何找出相关的设备名称(每次物理连接设备时它都是不同的),但是为了使您的程序正常工作,您必须更改该设备文件的权限:

sudo chgrp dialout /dev/bus/usb/003/010

更新

今天我了解得更多了。你可以使用 lsusb 获取设备 ID:

$ lsusb
[...]
Bus 003 Device 010: ID dead:beef Your awesome device

因此,将 Bus 作为第一路径部分,将 Device 作为第二路径部分。

或者,你可以为其编写一个 udev 规则:

# /etc/udev/rules.d/51-awesomedevice.rules:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="dead", ATTRS{idProduct}=="beef", GROUP="dialout", MODE="0660"

相关内容