ধারাবাহিক লিনাক্স ডিভাইস গণনা


13

আমাদের লিনাক্স বাক্সে আমাদের কাছে ইউএসবি -> সিরিয়াল ডিভাইস রয়েছে যা সর্বদা হিসাবে চিহ্নিত ছিল /dev/ttyACM0। তাই আমি একটি আবেদন লিখেছি এবং গতকাল পর্যন্ত, সবকিছু ঠিকঠাক কাজ করেছে। তবে হঠাৎ (হ্যাঁ, দূরবর্তী উপস্থাপনার সময় ...) ডিভাইসটি কাজ করা বন্ধ করে দিয়েছে। দ্রুত গবেষণা করার পরে, আমি আবিষ্কার করেছি যে সংযোগটি পরিবর্তিত হয়েছে /dev/ttyACM1। এটি একটু অকাল ছিল, তবে এখন আমার একটি সমস্যা আছে - কীভাবে আমার ডিভাইসটি নির্বিঘ্নে সনাক্ত করা যায়? যেমন, উদাহরণস্বরূপ, স্টোরেজ ড্রাইভটি ইউইউডি ব্যবহার করে শুরু করা যেতে পারে যদিও /dev/sd**পরিবর্তিত হয়েছে। সিরিয়াল ডিভাইসগুলির জন্য এটি করার কোনও উপায় আছে?

এখন আমি একটি বোকা workaround ব্যবহার:

for(int i = 0; i < 10; i ++)
{
    m_port = std::string("/dev/ttyACM") + (char)('0' + i);
    m_fd = open(m_port.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
}

লিংক ডিভাইস আমরা ব্যবহার করতে।

উত্তর:


19

যেহেতু আমরা ইউএসবি ডিভাইসগুলির সাথে কথা বলছি এবং ধরে নিচ্ছি যে আপনার কাছে দেবী আছে তাই আপনি কিছু উডব বিধি তৈরি করতে পারেন।

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

এখন, প্রথমে আপনার বিক্রেতা এবং পণ্য আইডি দরকার:

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC

এর পরে, আপনার ক্রমিক নম্বরটি প্রয়োজন (যদি আপনার কয়েকটি থাকে):

# udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
    ATTRS{serial}=="A6008isP"

এখন, একটি udev নিয়ম তৈরি করতে দিন:

UDEV নিয়মগুলি সাধারণত অনেকগুলি ফাইলগুলিতে বিভক্ত হয় /etc/udev/rules.d। নামক একটি নতুন ফাইল তৈরি করুন 99-usb-serial.rulesএবং নীচের লাইনটি সেখানে রাখুন, আমার কাছে তিনটি ডিভাইস রয়েছে, যার প্রতিটি এএর সিরিয়াল নম্বর সহ:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

ls -l /dev/MySerialDevice
lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1

আপনি যদি সিরিয়াল নম্বরটি না চান, একই চিপযুক্ত বিক্রেতার কাছ থেকে যে কোনও ডিভাইস একই সিমিলিংকটি পাবে, যে কোনও সময় কোনও একটিতে প্লাগ ইন করা যেতে পারে।

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="MySerialDevice"

এখান থেকে নেওয়া হয়েছে


3
আপনার যদি সাম্প্রতিক লিনাক্স বিতরণ থাকে তবে সম্ভবত এটি ইতিমধ্যে স্বয়ংক্রিয়ভাবে ডিভাইসটিকে তৈরি করে /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0। এটি কাস্টম উদেব বিধিবিহীন আপনার পক্ষে যথেষ্ট।
জোসেফ

1
দুর্ভাগ্যক্রমে, অনেক নামবিহীন ডিভাইসের সকলের ক্রমিক নম্বর "0123456789abcdef" রয়েছে। এটি যেখানে আকর্ষণীয় হয়ে ওঠে।
মস্কি

@ মোসবি কি সিরিয়াল নম্বরগুলি অপরিবর্তনীয়?
ওগানএম

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