如何以静态名称绑定USB设备?


43

我有时被绑定到一个Arduino /dev/ttyUSB0和其他时间/dev/ttyUSB1,让我的脚本失败。

我不想枚举设备可能在哪里的所有可能性,但我希望将其绑定到某个静态位置,例如/dev/arduino

我该如何实现?


4
只需编写一个简单的udev规则,即可通过其VID和PID将symlink / dev / arduino分配给正确的设计。
Eddy_Em


Answers:


41

根据建议,您可以添加一些udev规则。我编辑了,/etc/udev/rules.d/10-local.rules以包含:

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"

您可以通过运行以下命令检查设备的变量

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)

您可以在http://www.reactivated.net/writing_udev_rules.html上阅读更深入的指南


像魅力一样工作。一个问题:如何退出udevam?并请注意my_uart在下创建符号链接,这一点很重要/dev/my_uart。我第一次写书/dev/arduino,但失败了arduino就足够了。
k0pernikus 2013年

udevadm完成后应自行退出。
Kotte

然后由于某种未知原因,它在生成报告时冻结了到我的Raspberry Pi的终端会话。
k0pernikus 2013年

35

上面的规则语法可能在某些发行版上有效,但不适用于我的(Raspbian)。由于我从来没有找到一个可以解释所有内容的文档,所以我写了自己的文档,可以在这里找到。这就是归结为。
1.找出ttyUSB上的内容:

dmesg | grep ttyUSB  

2.列出设备的所有属性:

udevadm info --name=/dev/ttyUSBx --attribute-walk

(当然,使用您的设备号而不是x)。选择一个唯一的标识符集,例如idVendor + idProduct。如果您有多个具有相同idVendor和idProduct的设备,则可能还需要SerialNumber。序列号对于每个设备应该是唯一的。
3.创建一个包含以下内容的文件/etc/udev/rules.d/99-usb-serial.rules

SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name" 

(假设您在那里不需要序列号,当然也不需要在步骤2中找到的idVendor和idProduct的序列号
。4.加载新规则:

sudo udevadm trigger

5.验证发生了什么:

ls -l /dev/your_device_name  

将显示符号链接转到的ttyUSB编号。如果是/dev/ttyUSB1,则验证谁拥有它以及它属于哪个组:

ls -l /dev/ttyUSB1   

然后只是为了好玩:

udevadm test -a -p  $(udevadm info -q path -n /dev/your_device_name)

那么如果idVendoridProduct完全相同,有什么解决方案吗?(两个传感器连接到相同型号的USB至UART模块上)
Steven Lu

@StevenLu是的,请参见步骤2,udevadm info --name=/dev/ttyUSB1 --attribute-walk对两个设备都使用并查找序列号,它们对于每个设备都应该是唯一的。如果您的传感器没有序列号,您可以指定它们是什么吗?
RolfBly

太棒了,我会在尝试时向您报告
Steven Lu

我的$ 2 USB转UART加密狗的序列号为0001。不能说我很惊讶。看来我必须根据其输出协议来识别传感器。
史蒂文·卢

@StevenLu运气不好。FTDI USB-UART转换器确实具有唯一的序列号AFAIK。多花一些钱,但开发时间却更少。
RolfBly

9

多个USB设备问题

我有一个带四台相机的Rasperry Pi。我拿PIX与fswebcam识别摄像机作为/dev/video0.. video3。有时相机video0vide02video4video6,但我们可以有关忘记了。

我需要一个永久性ID来标识摄像机编号,以便例如video0始终是同一台摄像机,因为我为图片加了标题。不幸的是,这种情况无法可靠地发生-在启动时,摄像机被枚举为video0..,video3但并不总是相同。

摄像机都具有相同的ID和序列号。

这个问题的解决方案涉及udev规则,但是那里也有很多鱼钩。

如果您发出命令

udevadm info –attribute-walk –path=/dev/video0

您会得到一整段输出,但显着的位是

KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.

KERNELS位是USB集线器端口。对于四个摄像机,其中有四个-重启后它们不会更改,但是video{x}与端口关联的可能会更改。

因此,我们需要一个udev规则将视频编号绑定到USB集线器端口-类似于:

KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0” 

看起来很简单–使用

fswebcam –d  $realpath /dev/camera0

除非它不起作用–如果将其放入udev规则中,并且系统已将video0(在启动时)分配给另一个端口,则将忽略udev规则。的符号链接/dev/camera0基本上说no such device。方一。

我们想要的是将符号链接绑定到USB集线器地址,而不是video{x}数字。它花了一个Python程序。

第一步是运行

fswebcam –d /dev/video${x}  tst.jpg

x1和8的存在之间tst.jpg每个呼叫之后识别是否存在在该视频数的摄像机。从中列出有效的视频编号。我的经验是,它要么是0,1,2,30,2,4,6用于相机我都用过。

其他人当然可以使用其他过程来构建此列表。

然后为列表中的每个视频编号运行

udevadm info –attribute-walk –path=/dev/videox > dd

并提取KERNELS= linedd。通过此过程,您最终获得了相机的USB端口地址列表。对列表进行排序,以便在下一步中始终按相同的顺序进行处理。称其为“地址列表”。

udevadm … > dd再次运行该东西,并列出一个看起来像

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.

现在逐步浏览地址列表-对于每个条目,从视频列表中找到相应的条目。创建一个看起来像一系列行的新列表

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”

x(符号链接号)将替换为地址列表中的序列号。

现在,您有了一条可以正常运行的udev规则。不论引导时分配给该端口什么视频号,都将绑定到USB集线器地址的符号链接。

将最终列表写入文件/etc/udev/rules.d/cam.rules。运行udevadm trigger以激活它,作业完成。 /dev/camera2不论其视频编号如何,都将是同一台相机(USB端口)。


欢迎使用unix stackexchange。请使用markdown格式化您的答案。我只是为你做的。还请记住,我们希望答案是重点。这读起来更像是一个博客条目(这并不完全不好),但是先阅读一下无效的方法并没有帮助。您可以报废那部分。
k0pernikus

抱歉。我是新来的。我已经研究了这个问题几个月了。我确实发现其他人也遇到同样的问题,但没有找到适合我的答案。就是这样,我知道,您会在哪里建议我发布这样的内容?我确实克制自己,不包括Python来源:-)
Ian Boag

1

我还能够在中找到一个独特的设备/dev/serial/by-id。我还没有尝试过重新启动,但是该目录中的文件只是指向相应设备文件(ttyACM[0-9])的链接。

我在Raspberry Pi上运行arch linux,但是我只是通过find对包含“ Arduino”的文件名进行偶然发现。使用这些文件作为设备,我的python程序可以很好地运行,以将数据读取到Arduino或从Arduino读取数据(到目前为止,单个Pi上有两个)。


0

只是说以上内容对我有用,并且在我将条目放置在/ etc / fstab中之后也自动为我安装了该设备(并且在移除存储棒后也调用了umount)

/ etc / fstab

# See /etc/udev/rules.d/5-usb-disk.rules
/dev/backup     /vol/backup     ext4    defaults,errors=remount-ro 0       1

猫/etc/udev/rules.d/5-usb-stick.rules

#
# the next line creates a symlink to this disk drive called /dev/backup 
# i.e.
#   root:# ls -la /dev/backup 
#   lrwxrwxrwx 1 root root 3 Jul 22 19:33 /dev/backup -> sg0

# Backup usb stick - create /dev/backup
# ATTRS{model}=="Cruzer Blade    "
ACTION=="add", ATTRS{model}=="Cruzer Blade    ", SYMLINK+="backup"

# Clean up after removal  
ACTION=="remove", ATTRS{model}=="Cruzer Blade    ", RUN+="/bin/umount /vol/backup"

因此,插入我的USB棒后,我得到:

root:# mount | grep sd
/dev/sda1 on /vol/backup type ext4 (rw,relatime,errors=remount-ro,data=ordered)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.