我有时被绑定到一个Arduino /dev/ttyUSB0
和其他时间/dev/ttyUSB1
,让我的脚本失败。
我不想枚举设备可能在哪里的所有可能性,但我希望将其绑定到某个静态位置,例如/dev/arduino
。
我该如何实现?
我有时被绑定到一个Arduino /dev/ttyUSB0
和其他时间/dev/ttyUSB1
,让我的脚本失败。
我不想枚举设备可能在哪里的所有可能性,但我希望将其绑定到某个静态位置,例如/dev/arduino
。
我该如何实现?
Answers:
根据建议,您可以添加一些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
就足够了。
udevadm
完成后应自行退出。
上面的规则语法可能在某些发行版上有效,但不适用于我的(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)
idVendor
和idProduct
完全相同,有什么解决方案吗?(两个传感器连接到相同型号的USB至UART模块上)
udevadm info --name=/dev/ttyUSB1 --attribute-walk
对两个设备都使用并查找序列号,它们对于每个设备都应该是唯一的。如果您的传感器没有序列号,您可以指定它们是什么吗?
我有一个带四台相机的Rasperry Pi。我拿PIX与fswebcam
识别摄像机作为/dev/video0
.. video3
。有时相机video0
,vide02
,video4
和video6
,但我们可以有关忘记了。
我需要一个永久性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
为x
1和8的存在之间tst.jpg
每个呼叫之后识别是否存在在该视频数的摄像机。从中列出有效的视频编号。我的经验是,它要么是0,1,2,3
或0,2,4,6
用于相机我都用过。
其他人当然可以使用其他过程来构建此列表。
然后为列表中的每个视频编号运行
udevadm info –attribute-walk –path=/dev/videox > dd
并提取KERNELS= line
从dd
。通过此过程,您最终获得了相机的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端口)。
我还能够在中找到一个独特的设备/dev/serial/by-id
。我还没有尝试过重新启动,但是该目录中的文件只是指向相应设备文件(ttyACM[0-9]
)的链接。
我在Raspberry Pi上运行arch linux,但是我只是通过find
对包含“ Arduino”的文件名进行偶然发现。使用这些文件作为设备,我的python程序可以很好地运行,以将数据读取到Arduino或从Arduino读取数据(到目前为止,单个Pi上有两个)。
只是说以上内容对我有用,并且在我将条目放置在/ 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)