অভিন্ন ইউএসবি-টু-সিরিয়াল অ্যাডাপ্টারের মধ্যে পার্থক্য কীভাবে করবেন?


26

আমি আমার ল্যাপটপের সাথে অনেকগুলি অভিন্ন ইউএসবি-টু-সিরিয়াল অ্যাডাপ্টার ব্যবহার করি (উবুন্টু 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>

সমস্ত অ্যাডাপ্টার একটি একক ইউএসবি হাব প্লাগ ইন করা হয়। যেহেতু আমি নিজেই অ্যাডাপ্টারের মধ্যে পার্থক্য করতে পারছি না, এমন কোনও উপায়ে কি আমি এমন কোনও উপায়ে বিধি লিখতে পারি যা প্রতিটি অ্যাডাপ্টারের নাম স্থির করে হাবের কোন ভৌত বন্দরটির উপর ভিত্তি করে অ্যাডাপ্টারের প্লাগ ইন করা হয়?

উত্তর:


24

আমি কোনও উপায়ে বিধি লিখতে পারি যে প্রতিটি অ্যাডাপ্টারের নাম স্থির করে হাবের কোন শারীরিক পোর্টের উপর ভিত্তি করে অ্যাডাপ্টারটি প্লাগ ইন করা হয়?

হ্যাঁ আছে, এটি পরিণত হিসাবে। উপরের দ্বিতীয় উদাহরণে দেখানো ডিভাইস শ্রেণিবদ্ধের শেষ অংশটি বিবেচনা করুন:

প্যারেন্ট ডিভাইস '/ ডিভাইসস / পিপিসি.সি.০০.০০/০০০০:০০dddd/usb1/1-4/1-4.5': কার্নেলস ==
"
1-4.5 " সাবস্কায়মস == "ইউএসবি " ড্রাইভার "=" "ইউএসবি "
এটিটিআরএস {কনফিগারেশন} ==" "
এটিটিআরএস {বিনিউম ইন্টারফেসস} ==" 1 "
এটিটিআরএস {বিসিফিকেশন ভ্যালু = ==" 1 "
এটিটিআরএস {বিএমএ্যাট্রিবিউটস} ==" 80 "
এটিটিআরএস {বিম্যাক্সপাওয়ার {=="
100mAAb " = "69"
ATTRS {idVendor} == "067b"
ATTRS {idProduct} == "2303"
ATTRS {bcdDevice} == "0300"
ATTRS {bDeviceClass} == "00"
ATTRS {bDeviceSubClass} == "00"
ATTRS {বিডভাইসপ্রোটোকল} == "00"
এটিটিআরএস {বিএনউম কনফিগারেশন} == "1"
ATTRS {bMaxPacketSize0} == ""৪"
এটিটিআরএস {গতি} == "12"
এটিটিআরএস {বাসনাম} == "1"
এটিটিআরএস {ডেভনাম} == "7" এটিটিআরএস {সংস্করণ = == "1.10" এটিটিআরএস {ম্যাকচাইল্ড = == "0" এটিটিআরএস {কিরক} == "0x0"
এটিটিআরএস {অনুমোদিত} == "1"
এটিটিআরএস {প্রস্তুতকারক} = = "প্রশান্ত প্রযুক্তি ইনক।"
এটিটিআরএস {পণ্য} == "ইউএসবি-সিরিয়াল কন্ট্রোলার"

কার্নেলের দ্বারা এই ডিভাইসে প্রদত্ত নামটি (KERNELS == "1-4.5") ইঙ্গিত করে যে এই ডিভাইসটি 1 বাসের পোর্ট ফোরের সাথে সংযুক্ত একটি হাবের পঞ্চম বন্দরে প্লাগ ইন করা হয়েছে ( কীভাবে ডিকোড করতে হবে তার আরও তথ্যের জন্য এই FAQ দেখুন sysfs ইউএসবি ডিভাইস শ্রেণিবিন্যাস)। উদেব বিধিগুলি লেখার জন্য এই গাইডের কিছু সহায়তার সাথে আমি আমার ইউএসবি-টু-সিরিয়াল-পোর্ট রূপান্তরকারীদের জন্য নীচে udev নিয়মগুলির সেট নিয়ে এসেছি:

কার্নেল == "ttyUSB *", কার্নেলস == "1-8.1.5", NAME =
"ttyUSB0" কার্নেল == "ttyUSB *", কার্নেলস == "1-8.1.6", NAME = "ttyUSB1" কার্নেল
= = "ttyUSB *", কার্নেলস == "1-8.1.1", NAME = "ttyUSB2" কার্নেল
== "ttyUSB *", কার্নেলস == "1-8.1.2", নাম = "ttyUSB3"

এই বিধিগুলির একটি সুস্পষ্ট অসুবিধা রয়েছে: তারা ধরে নেয় যে সমস্ত ইউএসবি-থেকে-সিরিয়াল রূপান্তরকারী একই হাবটিতে প্লাগ ইন করা হবে ("1-8.1। *")। যদি কোনও ইউএসবিতে সিরিয়াল রূপান্তরকারীটিকে অন্য একটি ইউএসবি পোর্টে প্লাগ করা হয় তবে এটি "ttyUSB0" নাম নির্ধারণ করা যেতে পারে যা উপরে বর্ণিত নামকরণের স্কিমের সাথে দ্বন্দ্ব করবে। তবে যেহেতু আমি সমস্ত রূপান্তরকারীকে হাবের সাথে প্লাগ করে রেখেছি আমি এই সীমাবদ্ধতার সাথে বেঁচে থাকতে পারি।


1
এই উত্স উদ্ধৃত করার জন্য ধন্যবাদ। লিনাক্স ইউএসবি প্রায়শই জিজ্ঞাসা করা প্রশ্নাবলী আমি ঠিক কী প্রয়োজন ছিল তা ছিল না।
লুকাস

16

যদিও এটি এই নির্দিষ্ট ক্ষেত্রে সহায়তা করবে না, কিছু অ্যাডাপ্টারগুলিকে অনন্য সিরিয়াল আইডির দায়িত্ব দেওয়া হয়েছে:

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

অ্যাডাপ্টার সিরিয়াল আইডির একটি উদাহরণ:

  ATTRS{serial}=="A6008isP"`

এবং উদেব বিধিগুলিতে তখন অন্তর্ভুক্ত থাকবে:

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

সূত্র


7
দুঃখের বিষয়, বেশিরভাগ সস্তার সিরিয়াল অ্যাডাপ্টারের অনন্য সিরিয়াল নেই :(
পোর্টফোর্ডপোডকাস্ট

7

আপনি কি বিষয়বস্তু তাকান /dev/serial/by-id/? অনুরূপ পরিস্থিতিতে প্রতিটি ডিভাইসকে সেখানে একটি অনন্য অবিচ্ছিন্ন আইডি বরাদ্দ করা হয়েছিল (আমি স্বীকার করি এটি আসলে কী উপস্থাপন করে তা জানি না)।


<VENDOR><delimeter><MODEL><delimeter><SERIAL>
পিথিকোস

3

যেহেতু মূল প্রশ্নটি 3 বছর আগে জিজ্ঞাসা করা হয়েছিল, এটি হয়ত প্রশ্নকর্তাকে সম্বোধন করবে না, তবে আমি ভবিষ্যতের রেফারেন্সের জন্য এটি পোস্ট করব।

এফটিডিআই-চিপসের EEPROM অ্যাক্সেস করে সিরিয়াল নম্বরটি পুনরায় প্রোগ্রাম করার একটি উপায় রয়েছে, সিলিকন ল্যাবগুলি একটি সরঞ্জাম সরবরাহ করে তবে এটি কেবল উইন্ডোজ:

পণ্য পৃষ্ঠা -> সরঞ্জাম-> ফিক্সড ফাংশন কাস্টমাইজেশন ইউটিলিটি

সরাসরি লিঙ্ক

রিমোটহিকিউতে একটি নির্দেশিকা পাওয়া যাবে:

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

সোর্সফোর্জে একটি ইউনিক্স গ্রন্থাগারও রয়েছে। এটি কেবল সিপি 2101 / সিপি 2102 / সিপি 2103 দিয়ে পরীক্ষা করা হয় এবং আমি ব্যক্তিগতভাবে এটি চেষ্টা করে দেখিনি।

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


1

আমার ফরম্যাটিং দরকার বলে মন্তব্য করার পরিবর্তে একটি উত্তর ব্যবহার করা।

এই বিধিগুলির একটি সুস্পষ্ট অসুবিধা রয়েছে: তারা ধরে নেয় যে সমস্ত ইউএসবি-থেকে-সিরিয়াল রূপান্তরকারী একই হাবটিতে প্লাগ ইন করা হবে ("1-8.1। *")। যদি কোনও ইউএসবিতে সিরিয়াল রূপান্তরকারীটিকে অন্য একটি ইউএসবি পোর্টে প্লাগ করা হয় তবে এটি "ttyUSB0" নাম নির্ধারণ করা যেতে পারে যা উপরে বর্ণিত নামকরণের স্কিমের সাথে দ্বন্দ্ব করবে। তবে যেহেতু আমি সমস্ত রূপান্তরকারীকে হাবের সাথে প্লাগ করে রেখেছি আমি এই সীমাবদ্ধতার সাথে বেঁচে থাকতে পারি।

আমার এই সমস্যাটি ছিল এবং এটি% devpath এর পাঠ্য বা আপনার পছন্দের কোনও ইউএসবি বৈশিষ্ট্যটি ব্যবহার করে সহজেই একটি ছোট সি প্রোগ্রাম ব্যবহার করে ঠিক করা হয়েছে।

আপনি তারপরে সেই প্রোগ্রামটিকে কল করুন:

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;
}

আমি আরও বিশদ সহ একটি ব্লগ নিবন্ধ লিখেছিলাম । এটি এম্বেডড সিস্টেম টিম প্রোগ্রামিং পরিবেশ স্থাপনের অন্যতম একটি সিরিজ in


0

আপনি এটির মতো ইউএসবি সিরিয়াল ডিভাইসগুলি তালিকাভুক্ত করতে পারেন

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সংযোগ বিচ্ছিন্ন হওয়ার পরে পরিষ্কার হচ্ছে না, তবে আমি এটি নিয়েই বাঁচতে পারি, যেহেতু আমি খুব কমই একটি ইউএসবি পোর্ট থেকে অন্য একটি ইউএসপি পোর্টে অ্যাডাপ্টারগুলি পরিবর্তন করি।


আমার সমস্যাটি ছিল যে একটি রাস্পবেরি পাই যা ইউএসবি কেবল দ্বারা সংযুক্ত একটি আরডুইনোর মাধ্যমে শাটারের রিলে নিয়ন্ত্রণ করে এবং অন্য আরডুইনো (একই উত্পাদনকারী, একই মডেল) এর মাধ্যমে পরিবেশ সংবেদনের ডেটা পড়ে, মাঝে মাঝে যখন শাটারগুলি সক্রিয় হয়, সেন্সর ডেটা আরডুইনো লাথি পেয়ে যায় বোর্ডটি বন্ধ করে 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

আমি কেবল তখনই এই চেকটি সঞ্চালন করি যখন কোনও সংযোগ ত্রুটির কারণে সময়সীমা ঘটে থাকে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.