簡體   English   中英

如何在Ubuntu 10.1下識別多個USB串行適配器

[英]How to identify multiple USB-serial adapters under Ubuntu 10.1

我正在Ubuntu 10.1下從多個相同的USB串行適配器讀取數據。

有時,它們的/ dev / tty路徑會發生變化(例如,如果啟動時連接了其他USB設備)。

我需要一種通過任何此類更改重復引用相同適配器的方法。

根據udevadm,這些設備都具有相同的序列號。

我認為最可能的選擇是識別連接到哪個端口的適配器(它們不會被移動)。

我可以找到可能有用的各種有趣的/ dev路徑,但是盡管有關於udev在線的所有討論,但是如果設備插入靜態端口,我找不到關於這些路徑中的某些路徑是否是靜態的明確聲明。

有一個解決方案。 從來沒有好過晚了;)

使用以下udev規則將/dev/ttyUSB{?}設備映射到/dev/usb-ports/%bus_id-%port_id鏈接。

這是我的/etc/udev/rules.d/usb-parse-devpath.rules:

ACTION=="add", KERNEL=="ttyUSB[0-9]*", PROGRAM="/etc/udev/rules.d/usb-parse-devpath.pm %p", SYMLINK+="usb-ports/%c"

usb-parse-devpath.pm腳本:

#!/usr/bin/perl -w

@items = split("/", $ARGV[0]);
for ($i = 0; $i < @items; $i++) {
    if ($items[$i] =~ m/^usb[0-9]+$/) {
        print $items[$i + 1] . "\n";
        last;
    }
}

如您所見,這有助於我們創建指向/dev/ttyUSB{?}設備的命名鏈接,並將它們放在/dev/usb-ports中,格式如下: bus_id-port_id

例如,下一個命令給出了以下內容:

$ udevadm info --query=path --name=/dev/ttyUSB0
/devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/ttyUSB0/tty/ttyUSB0

所以, bus_id3port_id1 ,現在我的/dev/usb-ports有以下內容:

$ ls -al /dev/usb-ports
lrwxrwxrwx  1 root root   10 Май 12 00:26 3-1 -> ../ttyUSB0

問候。

請查看$ udevadm info -n /dev/ttyUSB0 -a USB設備插入的端口。其中一個父設備的變量KERNELS應該類似於KERNELS ==“1-1.2:1.0”。

創建一個udev規則:

SUBSYSTEM=="tty", KERNELS=="1-1.2:1.0", SYMLINK+="ttyUSB42"
SUBSYSTEM=="tty", KERNELS=="1-1.3:1.0", SYMLINK+="usb-serial"

並觸發udev

$ udevadm trigger

我有許多USB到串行設備, 每個端口很多,上面提到的解決方案對我來說並不是很好。

USB“KERNEL”在我的情況下是不夠的,但我找到了端口號。

我知道我現在提出的建議可能會被認為是一個瘋狂的黑客,但它對我有用..
目前..

我真的很高興看到一個更優雅的建議,實現類似的東西..

所以...基於之前的答案形式Ilya Matveychikov

文件:/etc/udev/rules.d/usb-parse-devpath.sh

#!/bin/bash

DEVNUM=$(echo "${1}" | rev | cut -d'/' -f4 | rev | tr -d '-' | tr -d '.' | tr -d ':')
PORTNUM=$(/sbin/udevadm info -a --path=${1} | grep "ATTRS{port_number}" | head -1 | cut -d'"' -f2)
PRODUCT=$(/sbin/udevadm info -a --path=${1} | grep "ATTRS{product}" | head -1 | cut -d'"' -f2 | tr -d '/' | tr ' ' '_')

NEWID="ttyUSB_${PRODUCT}_${DEVNUM}${PORTNUM}"

#echo "${NEWID} :: $1" >> /tmp/DEBUG_udev.txt

echo "$NEWID"

和文件:/etc/udev/rules.d/99-usb-serial.rules

ACTION=="add", KERNEL=="ttyUSB[0-9]*", PROGRAM="/etc/udev/rules.d/usb-parse-devpath.sh %p", SYMLINK+="TTYUSBs/%c"

結果看起來像這樣:

# ls -l /dev/TTYUSBs

lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435100 -> ../ttyUSB20
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435101 -> ../ttyUSB21
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435102 -> ../ttyUSB22
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435103 -> ../ttyUSB23
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435104 -> ../ttyUSB24
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435105 -> ../ttyUSB25
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435106 -> ../ttyUSB26
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435107 -> ../ttyUSB27
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436100 -> ../ttyUSB28
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436101 -> ../ttyUSB29
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436102 -> ../ttyUSB30
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436103 -> ../ttyUSB31
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436104 -> ../ttyUSB32
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436105 -> ../ttyUSB33
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436106 -> ../ttyUSB34
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436107 -> ../ttyUSB35
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport4_4341100 -> ../ttyUSB38
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport4_4341101 -> ../ttyUSB39
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport4_4342100 -> ../ttyUSB36
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport4_4342101 -> ../ttyUSB37
lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Edgeport8_421100 -> ../ttyUSB2
lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Edgeport8_421101 -> ../ttyUSB3
lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Edgeport8_422100 -> ../ttyUSB4
lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Edgeport8_422101 -> ../ttyUSB5
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport8_423100 -> ../ttyUSB18
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport8_423101 -> ../ttyUSB19
lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Edgeport8_424100 -> ../ttyUSB0
lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Edgeport8_424101 -> ../ttyUSB1
lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_431100 -> ../ttyUSB6
lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_431101 -> ../ttyUSB7
lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_431102 -> ../ttyUSB8
lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_431103 -> ../ttyUSB9
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_432100 -> ../ttyUSB10
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_432101 -> ../ttyUSB11
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_432102 -> ../ttyUSB12
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_432103 -> ../ttyUSB13
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_433100 -> ../ttyUSB14
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_433101 -> ../ttyUSB15
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_433102 -> ../ttyUSB16
lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_433103 -> ../ttyUSB17

就像Ilya Matvejchikov的回答一樣,一個好的解決方案就是添加udev規則來做你想要的設備。 和你一樣,我遇到了類似的問題。 我在USB到多串口適配器上安裝了UPS,偶爾系統會切換/ dev / tty號碼。

我的解決方案是創建一個規則,通過驅動程序和端口匹配設備類型,然后創建一個指向我的UPS所連接端口的符號鏈接。 我用NUT來監控UPS,它總是插在同一個物理端口上。

# File contents of /etc/udev/rules.d/75-nut-ups.rules
# Create /dev/nut-ups0 to use as a persistent serial device that can be used
# reliably by nut to communicate with a UPS attached to the system.
# The UPS is attached to the first port of a MosSemiconductor dual USB
# serial adapter.
KERNELS=="ttyUSB*", SUBSYSTEMS=="usb-serial", DRIVERS=="moschip7720", ATTRS{port_number}=="0", SYMLINK+="nut-ups0"

現在我將NUT配置為始終使用常量/ dev / nut-ups0,因為串行端口和規則在識別usb-serial設備時會正確映射。

您可以使用lsusb命令查找插入規則時要在規則中使用的實際設備名稱。

usb-devices可以獲取端口號和總線/ dev枚舉。

我也在搜索這個主題,以找到分配/連接到邏輯/ dev設備名稱的物理USB設備的方法。 所以,經過一些反復試驗,這對我來說最有用:

查看存在哪些邏輯ttyUSBx設備(其中x為0,1,2 ......):

$ ls /dev

顯示所有USB串行適配器的總線和設備編號:

$ lsusb 

最后,使用:

$ udevadm info --name=ttyUSBx --attribute-walk | grep num  

現在檢查udevadm輸出以使邏輯設備名稱與實際物理設備匹配。 我這樣做的時候是我的上市:

$ lsusb
Bus 002 Device 005: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial     (UART) IC
Bus 002 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 002 Device 002: ID 80ee:0021  
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

$ udevadm info --name=ttyUSB0 --attribute-walk | grep num
    ATTRS{port_number}=="0"
    ATTRS{urbnum}=="812"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="5"
    ATTRS{urbnum}=="115"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="1"
    ATTRS{numa_node}=="-1"

$ udevadm info --name=ttyUSB1 --attribute-walk | grep num
    ATTRS{port_number}=="0"
    ATTRS{urbnum}=="465"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="4"
    ATTRS{urbnum}=="115"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="1"
    ATTRS{numa_node}=="-1"

因此,在我的情況下,ttyUSB0與bus2上的設備相關聯,即device5,即Future Technology Devices International USB轉串口適配器; 同樣,ttyUSB1與bus2,device4上的設備相關聯,這是Prolific Technology,Inc。的USB轉串口適配器。

正如已經指出的那樣,命令:

$ usb-devices

將以一條線的方式為您提供相同的信息。 我想我會發布一些細節,幫助我了解幕后的工作原理......

希望有幫助:)

這些設備都具有相同的序列號[..]

usb-parse-devpath.pm通過使用適配器的總線和端口ID來解決這個問題。

暫無
暫無

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

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