समान यूएसबी-टू-सीरियल एडेप्टर के बीच अंतर कैसे करें?


26

मैं अपने लैपटॉप (Ubuntu 9.10) के साथ कई समान यूएसबी-टू-सीरियल एडेप्टर का उपयोग करता हूं। एडाप्टर्स सब्रेंट द्वारा निर्मित होते हैं और एक प्रोलिफिक PL2303 आईसी के आसपास निर्मित होते हैं, जैसा कि lsusbनिम्न द्वारा दिखाया गया है :

Bus 001 Device 008: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port  
Bus 001 Device 007: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port  
Bus 001 Device 006: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port  

प्रदर्शित विशेषताओं में udevadmसे कोई भी विशेष एडाप्टर के लिए अद्वितीय नहीं लगता है:

foo@bar:~$ udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB0

   looking at device
 '/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.1/1-4.1:1.0/ttyUSB0':  
     KERNEL=="ttyUSB0"  
     SUBSYSTEM=="usb-serial"  
     DRIVER=="pl2303"   
     ATTR{port_number}=="0"  

   looking at parent device
 '/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.1/1-4.1:1.0':
     KERNELS=="1-4.1:1.0"  
     SUBSYSTEMS=="usb"  
     DRIVERS=="pl2303"  
     ATTRS{bInterfaceNumber}=="00"  
     ATTRS{bAlternateSetting}==" 0"  
     ATTRS{bNumEndpoints}=="03"  
     ATTRS{bInterfaceClass}=="ff"  
     ATTRS{bInterfaceSubClass}=="00"  
     ATTRS{bInterfaceProtocol}=="00"  
     ATTRS{modalias}=="usb:v067Bp2303d0300dc00dsc00dp00icFFisc00ip00"  
     ATTRS{supports_autosuspend}=="1"  

   looking at parent device
 '/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.1':
     KERNELS=="1-4.1"   
     SUBSYSTEMS=="usb"  
     DRIVERS=="usb"   
     ATTRS{configuration}==""  
     ATTRS{bNumInterfaces}==" 1"  
     ATTRS{bConfigurationValue}=="1"  
     ATTRS{bmAttributes}=="80"  
     ATTRS{bMaxPower}=="100mA"  
     ATTRS{urbnum}=="538"  
     ATTRS{idVendor}=="067b"  
     ATTRS{idProduct}=="2303"  
     ATTRS{bcdDevice}=="0300"  
     ATTRS{bDeviceClass}=="00"  
     ATTRS{bDeviceSubClass}=="00"  
     ATTRS{bDeviceProtocol}=="00"  
     ATTRS{bNumConfigurations}=="1"  
     ATTRS{bMaxPacketSize0}=="64"  
     ATTRS{speed}=="12"  
     ATTRS{busnum}=="1"  
     ATTRS{devnum}=="6"  
     ATTRS{version}==" 1.10"  
     ATTRS{maxchild}=="0"  
     ATTRS{quirks}=="0x0"  
     ATTRS{authorized}=="1"  
     ATTRS{manufacturer}=="Prolific Technology Inc."  
     ATTRS{product}=="USB-Serial Controller"  

     <snip>

 foo@bar:~$ udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB1

   looking at device
 '/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5/1-4.5:1.0/ttyUSB1':
     KERNEL=="ttyUSB1"  
     SUBSYSTEM=="usb-serial"  
     DRIVER=="pl2303"  
     ATTR{port_number}=="0"  

   looking at parent device
 '/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5/1-4.5:1.0':
     KERNELS=="1-4.5:1.0"  
     SUBSYSTEMS=="usb"  
     DRIVERS=="pl2303"  
     ATTRS{bInterfaceNumber}=="00"  
     ATTRS{bAlternateSetting}==" 0"  
     ATTRS{bNumEndpoints}=="03"  
     ATTRS{bInterfaceClass}=="ff"  
     ATTRS{bInterfaceSubClass}=="00"  
     ATTRS{bInterfaceProtocol}=="00"  
     ATTRS{modalias}=="usb:v067Bp2303d0300dc00dsc00dp00icFFisc00ip00"  
     ATTRS{supports_autosuspend}=="1"  

   looking at parent device
 '/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5':
     KERNELS=="1-4.5"  
     SUBSYSTEMS=="usb"  
     DRIVERS=="usb"  
     ATTRS{configuration}==""  
     ATTRS{bNumInterfaces}==" 1"  
     ATTRS{bConfigurationValue}=="1"  
     ATTRS{bmAttributes}=="80"  
     ATTRS{bMaxPower}=="100mA"  
     ATTRS{urbnum}=="69"  
     ATTRS{idVendor}=="067b"  
     ATTRS{idProduct}=="2303"  
     ATTRS{bcdDevice}=="0300"  
     ATTRS{bDeviceClass}=="00"  
     ATTRS{bDeviceSubClass}=="00"  
     ATTRS{bDeviceProtocol}=="00"  
     ATTRS{bNumConfigurations}=="1"  
     ATTRS{bMaxPacketSize0}=="64"  
     ATTRS{speed}=="12"  
     ATTRS{busnum}=="1"  
     ATTRS{devnum}=="7"  
     ATTRS{version}==" 1.10"  
     ATTRS{maxchild}=="0"  
     ATTRS{quirks}=="0x0"  
     ATTRS{authorized}=="1"  
     ATTRS{manufacturer}=="Prolific Technology Inc."  
     ATTRS{product}=="USB-Serial Controller"  

     <snip>

सभी एडेप्टर एक ही यूएसबी हब में प्लग किए गए हैं। चूंकि मैं स्वयं एडेप्टर के बीच अंतर नहीं कर सकता हूं, क्या कोई ऐसा तरीका है जिससे मैं एक udv नियम लिख सकता हूं जो प्रत्येक एडेप्टर के नाम को ठीक करता है जिसके आधार पर हब पर भौतिक पोर्ट एडेप्टर को प्लग किया जाता है?

जवाबों:


24

क्या कोई तरीका है कि मैं एक udv नियम लिख सकता हूं जो प्रत्येक एडेप्टर के नाम को ठीक करता है जिसके आधार पर हब पर भौतिक पोर्ट एडॉप्टर को प्लग किया जाता है?

हाँ वहाँ है, जैसा कि यह पता चला है। ऊपर दिए गए दूसरे उदाहरण में दिखाए गए डिवाइस पदानुक्रम के अंतिम भाग पर विचार करें:

मूल उपकरण '/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5': KERNELS == "1-4.5"
SUBSYSTEMS == "usb"
DRIVER == "usb "
ATTRS {कॉन्फ़िगरेशन} ==" "
ATTRS {bNumInterfaces} ==" 1 "
ATTRS {bConfigurationValue} ==" 1 "
ATTRS {bmAttributes = =" "80"
ATTRS {bMaxPower} == "100mA"
ATTRS {urbum = "69"
ATTRS {idVendor} == "067b"
ATTRS {idProduct} == "2303"
ATTRS {bcdDevice} == "0300"
ATTRS {bDeviceClass} == "00"
ATTRS {bDeviceSubClass} == "00"
ATTRS {bDeviceProtocol} == "00"
ATTRS {bNumConfigurations} = = "1"
ATTRS {bMaxPacketSize0} == "64"
ATTRS {गति} == "12"
ATTRS {बसनामा} == "1"
ATTRS {devnum} == "7" ATTRS {version} == "1.10" ATTRS {maxchild} == "0" ATTRS {quirks} == "0x0"
ATTRS के अधिकृत} == "1"
ATTRS {निर्माता} = = = "प्रोलिफिक टेक्नोलॉजी इंक।"
ATTRS {उत्पाद} == "USB- सीरियल नियंत्रक"

कर्नेल द्वारा इस उपकरण को दिया गया नाम (KERNELS == "1-4.5") इंगित करता है कि यह डिवाइस बस 1 पर पोर्ट चार से जुड़े एक हब के पांचवें पोर्ट में प्लग किया गया है (देखें कि कैसे डीकोड करना है, इस बारे में अधिक जानकारी के लिए यह FAQ देखें) sysfs usb डिवाइस पदानुक्रम)। इस गाइड की कुछ सहायता से udev नियम लिखने के लिए मैं अपने USB-to-serial-port कन्वर्टर्स के लिए udev नियमों के निम्नलिखित सेट के साथ आया:

KERNEL == "ttyUSB *", KERNELS == "1-8.1.5", NAME = "ttyUSB0
" KERNEL == "ttyUSB *", KERNELS == "1-8.1.6", NAME = "ttyUSB1" KERNEL
= = "ttyUSB *", KERNELS == "1-8.1.1", NAME = "ttyUSB2" KERNEL
== "ttyUSB *", KERNELS == "1-8.1.2", NAME = "ttyUSB3"

इन नियमों का एक स्पष्ट नुकसान है: वे मानते हैं कि सभी यूएसबी-टू-सीरियल कन्वर्टर्स को एक ही हब ("1-8.1। *") में प्लग किया जाएगा। यदि एक USB सीरियल सीरियल कनवर्टर दूसरे USB पोर्ट में प्लग किया गया था, तो इसे "ttyUSB0" नाम दिया जा सकता है, जो ऊपर वर्णित नामकरण योजना के साथ संघर्ष करेगा। हालाँकि, जब से मैंने सभी कन्वर्टर्स को हब में प्लग किया, मैं इस बाधा के साथ रह सकता हूं।


1
उन स्रोतों का हवाला देने के लिए धन्यवाद। लिनक्स यूएसबी सवाल जवाब मैं वास्तव में क्या जरूरत थी।
लुकास

16

हालांकि यह इस विशिष्ट मामले में मदद नहीं करेगा, कुछ एडेप्टर को अद्वितीय सीरियल आईडी दिए गए हैं:

udevadm info -a -n /dev/ttyUSB1 | grep '{serial}'

एक उदाहरण एडाप्टर सीरियल आईडी:

  ATTRS{serial}=="A6008isP"`

और udv नियमों में तब शामिल होंगे:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="arduino"

स्रोत


7
अफसोस की बात यह है कि ज्यादातर सस्ते धारावाहिक एडाप्टरों में अद्वितीय धारावाहिक नहीं हैं :(
portforwardpodcast

7

क्या आपने की सामग्री को देखा है /dev/serial/by-id/? इसी तरह की स्थिति में प्रत्येक डिवाइस को वहां एक अद्वितीय लगातार आईडी सौंपा गया था (मुझे पता नहीं होगा कि यह वास्तव में क्या दर्शाता है)।


<VENDOR><delimeter><MODEL><delimeter><SERIAL>
पिथिकोस

3

चूंकि मूल प्रश्न 3 साल पहले पूछा गया था, इसलिए यह पूछने वाले को स्वीकार नहीं कर सकता है, लेकिन मैं इसे भविष्य के संदर्भ के लिए पोस्ट करूंगा।

एफटीडीआई-चिप्स के ईप्रॉम तक पहुंचकर सीरियल-नंबर को फिर से लिखने का एक तरीका है, सिलिकॉन लैब एक उपकरण प्रदान करता है, लेकिन यह केवल विंडोज है:

उत्पाद पृष्ठ -> उपकरण-> फिक्स्ड फ़ंक्शन अनुकूलन उपयोगिता

सीधा लिंक

एक निर्देश पर पाया जा सकता है:

http://remoteqth.com/wiki/index.php?page=How+to+set+usb+device+SerialNumber

Sourceforge पर एक यूनिक्स लाइब्रेरी भी है। यह केवल CP2101 / CP2102 / CP2103 के साथ परीक्षण किया जाता है और मैंने इसे व्यक्तिगत रूप से आज़माया नहीं था।

http://sourceforge.net/projects/cp210x-program/


1

एक टिप्पणी के बजाय एक उत्तर का उपयोग करना क्योंकि मुझे प्रारूपण की आवश्यकता है।

इन नियमों का एक स्पष्ट नुकसान है: वे मानते हैं कि सभी यूएसबी-टू-सीरियल कन्वर्टर्स को एक ही हब ("1-8.1। *") में प्लग किया जाएगा। यदि एक USB सीरियल सीरियल कनवर्टर दूसरे USB पोर्ट में प्लग किया गया था, तो इसे "ttyUSB0" नाम दिया जा सकता है, जो ऊपर वर्णित नामकरण योजना के साथ संघर्ष करेगा। हालाँकि, जब से मैंने सभी कन्वर्टर्स को हब में प्लग किया, मैं इस बाधा के साथ रह सकता हूं।

मेरे पास यह मुद्दा था और यह आसानी से एक छोटे सी प्रोग्राम का उपयोग करके तय किया जाता है कि% देवपथ या आपके चयन के कुछ अन्य यूएसबी विशेषता को हेरफेर करने के लिए।

आप तब उस प्रोग्राम को इस तरह कहते हैं:

ACTION!="add|change", GOTO="99-local-end

SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6001", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", GOTO="99-local-tty-ftdi"
GOTO="99-local-end"

LABEL="99-local-tty-ftdi"
IMPORT{program}="/usr/local/lib/udev/multiusbserial-id %s{devpath}"
# Hayes-style Modem
ENV{ID_MULTIUSBSERIAL_DEVNAME_MINOR}=="1", GROUP="dialout", MODE="0660", SYMLINK+="modem"
# Console for network device
ENV{ID_MULTIUSBSERIAL_DEVNAME_MINOR}=="2", GROUP="wheel", MODE="0660", SYMLINK+="ttyswitch"
# Serial port for software development
ENV{ID_MULTIUSBSERIAL_DEVNAME_MINOR}=="3", GROUP="eng", MODE="0660", SYMLINK+="ttyrouter"
# Unused
ENV{ID_MULTIUSBSERIAL_DEVNAME_MINOR}=="4", GROUP="wheel", MODE="0660"

LABEL="99-local-end"

जहाँ बहुभाषी-आईडी संकलित सी कार्यक्रम है।

कार्यक्रम को केवल एक विशेष बिंदु के बाद पाठ को प्रिंट करने की आवश्यकता है, इसलिए यह जटिल नहीं है

/* multiusbserial.c */
#include <stdio.h>
#include <stdlib.h>

#define PROGRAM_NAME "multiusbserial-id"
#define VARIABLE_PREFIX "ID_MULTIUSBSERIAL_"

int main(int argc, char *argv[])
{
  char *p;
  int found = 0;

  if (argc != 2) {
    fprintf(stderr, "Usage: " PROGRAM_NAME " ATTRS{devpath}\n");
    exit(1);
  }

  for (p = argv[1]; *p != '\0'; p++) {
    if (*p == '.') {
      p++;
      found = (*p != '\0');
      break;
    }
  }

  if (!found) {
    fprintf(stderr, PROGRAM_NAME ": unexpected format\n");
    exit(1);
  }

  printf(VARIABLE_PREFIX "DEVNAME_MINOR=%s\n", p);
  return 0;
}

मैंने अधिक विवरण के साथ एक ब्लॉग लेख लिखा । यह एक एम्बेडेड सिस्टम टीम प्रोग्रामिंग वातावरण स्थापित करने में एक श्रृंखला में से एक है।


0

आप USB सीरियल डिवाइस को इस तरह सूचीबद्ध कर सकते हैं

ls -l /sys/bus/usb-serial/devices
total 0
lrwxrwxrwx 1 root root 0 Oct  9 09:10 ttyUSB0 -> ../../../devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0
lrwxrwxrwx 1 root root 0 Oct  9 09:10 ttyUSB1 -> ../../../devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5:1.0/ttyUSB1

दो लाइनें खत्म हो रही हैं

1-1.3:1.0/ttyUSB0
1-1.5:1.0/ttyUSB1

यह एक रास्पबेरी पाई पर है। मैं अब ttyUSB1कनेक्टेड डिवाइस को छोड़ दूंगा , और एडॉप्टर को बाहर निकालकर ttyUSB0दूसरे पोर्ट में प्लग करूंगा , फिर दूसरा, और फिर वापस प्रारंभिक पोर्ट पर

यहाँ छवि विवरण दर्ज करें

# original setup
['1-1.3:1.0', 'ttyUSB0'] --
['1-1.5:1.0', 'ttyUSB1']

# move it to port above 1.3
['1-1.3:1.0', 'ttyUSB0']
['1-1.5:1.0', 'ttyUSB1']
['1-1.2:1.0', 'ttyUSB2'] --

# move it to port above 1.5
['1-1.3:1.0', 'ttyUSB0']
['1-1.5:1.0', 'ttyUSB1']
['1-1.4:1.0', 'ttyUSB2'] --

# move it back to the original port
['1-1.3:1.0', 'ttyUSB0'] --
['1-1.5:1.0', 'ttyUSB1']

मुझे नहीं पता कि 1-1.3:1.0वियोग होने पर सफाई क्यों नहीं हो रही है, लेकिन मैं इसके साथ रह सकता हूं, क्योंकि मैं शायद ही कभी एक यूएसबी पोर्ट से दूसरे एक में एडेप्टर को बदल देता हूं।


मेरा मुद्दा यह था कि एक रास्पबेरी पाई पर, जो यूएसबी केबल के माध्यम से संलग्न एक Arduino के माध्यम से शटर रिले को नियंत्रित करता है और एक अन्य Arduino (एक ही निर्माता, एक ही मॉडल) के माध्यम से पर्यावरण सेंसर डेटा को पढ़ता है, कभी-कभी, जब शटर सक्रिय हो जाता है, तो सेंसर डेटा Arduino को लात मारी गई बोर्ड से बाहर और ttyUSB0 से ttyUSB2 (ttyUSB1 शटर है) पर भरोसा किया। मैं इस पायथन लिपि के साथ समाप्त हो गया, ताकि परीक्षण और त्रुटि का पता न चल सके कि सेंसर डेटा किस उपकरण पर था।

usb_devices = collections.OrderedDict()
usb_device_list = subprocess.check_output('ls -l /sys/bus/usb-serial/devices', shell=True, universal_newlines=True).split('\n')
for usb_device in usb_device_list:
  match = re.search("([^/]+)/([^/]+)$", usb_device)
  if match:
    usb_devices[match.group(1)] = match.group(2)

for key, value in usb_devices.items():
  print key, value

# I know that 1.3 is the environment sensor device
if '1-1.3:1.0' in usb_devices:
  print '1-1.3:1.0 -->', usb_devices['1-1.3:1.0'] # == ttyUSB0

जो मुझे निम्न आउटपुट देता है

1-1.3:1.0 ttyUSB0
1-1.5:1.0 ttyUSB1
1-1.3:1.0 --> ttyUSB0

मैं केवल यह जांच करता हूं जब कनेक्शन त्रुटि के कारण टाइमआउट हो रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.