লিনাক্সে কীভাবে সমস্ত সিরিয়াল ডিভাইস (ttyS, ttyUSB, ..) খোলা না যায়?


113

লিনাক্স সিস্টেমে সমস্ত উপলব্ধ সিরিয়াল পোর্ট / ডিভাইসগুলির তালিকা পাওয়ার সঠিক উপায় কী?

অন্য কথায়, আমি যখন সমস্ত ডিভাইসগুলিতে প্রবেশ করি তখন আমি /dev/কীভাবে বলব যে কোনগুলি ধ্রুপদী উপায়ে সিরিয়াল বন্দর হয়, যা সাধারণত বাউড রেট এবং আরটিএস / সিটিএস ফ্লো নিয়ন্ত্রণকে সমর্থন করে?

সমাধান সি এ কোড করা হবে।

আমি জিজ্ঞাসা করছি কারণ আমি একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করছি যা এটি পরিষ্কারভাবে ভুল করে: এটি কেবল পুনরাবৃত্তি হবে বলে মনে হয় /dev/ttyS*। সমস্যাটি হ'ল উদাহরণস্বরূপ, ইউএসবি-র মাধ্যমে সিরিয়াল পোর্ট রয়েছে (ইউএসবি-আরএস 232 অ্যাডাপ্টারের দ্বারা সরবরাহিত) এবং সেগুলি / dev / ttyUSB * এর অধীনে তালিকাভুক্ত করা হয়েছে। এবং লিনাক্স.আরজে সিরিয়াল-হাওটো পড়তে , আমি ধারণা পেয়েছি যে সময় আসার সাথে সাথে অন্য নামের জায়গাগুলিও থাকবে।

সুতরাং সিরিয়াল ডিভাইসগুলি সনাক্ত করার জন্য আমার সরকারী উপায়টি খুঁজে বের করা উচিত। সমস্যাটি হ'ল কোনওটিই নথিভুক্ত বলে মনে হয় না, বা আমি এটি খুঁজে পাই না।

আমি কল্পনা করি এর একটি উপায় হ'ল সমস্ত ফাইল খুলতে হবে /dev/tty*এবং সেগুলিতে একটি নির্দিষ্ট কল করা ioctl()হবে যা কেবল সিরিয়াল ডিভাইসে উপলব্ধ। যদিও এটি একটি ভাল সমাধান হতে পারে?

হালনাগাদ

হিকার্ডস "সেটসিরিয়াল" এর উত্সটি দেখার পরামর্শ দিয়েছিলেন। এর কোডটি ঠিক আমার মনের মতো করে:

প্রথমত, এটি এর সাথে একটি ডিভাইস খোলে:

fd = open (path, O_RDWR | O_NONBLOCK)

তারপরে এটি আহবান করে:

ioctl (fd, TIOCGSERIAL, &serinfo)

যদি সেই কলটি কোনও ত্রুটি না দেয় তবে স্পষ্টতই এটি সিরিয়াল ডিভাইস।

সিরিয়াল প্রোগ্রামিং / টের্মিওসে আমি অনুরূপ কোড পেয়েছি , যা O_NOCTTYবিকল্পটি যোগ করার পরামর্শ দেয় ।

এই পদ্ধতির সাথে একটি সমস্যা রয়েছে, যদিও:

আমি যখন BSD ইউনিক্সে (যা ম্যাক ওএস এক্স) এই কোডটি পরীক্ষা করেছিলাম তখন এটি কাজ করে। যাইহোক , ব্লুটুথের মাধ্যমে সরবরাহ করা সিরিয়াল ডিভাইসগুলি সিস্টেম (ড্রাইভার) ব্লুটুথ ডিভাইসের সাথে সংযোগ স্থাপনের চেষ্টা করে, এটি একটি সময়সীমা ত্রুটির সাথে ফিরে আসার আগে কিছুটা সময় নেয়। এটি কেবলমাত্র ডিভাইস খোলার কারণে ঘটে। এবং আমি কল্পনা করতে পারি যে লিনাক্সেও একই রকম ঘটনা ঘটতে পারে - আদর্শভাবে, ডিভাইসটির ধরণটি বের করার জন্য আমার খোলার দরকার নেই। আমি অবাক হয়েছি যদি সেখানে ioctlএকটি খোলা ছাড়াই ফাংশন আহ্বান করার কোনও উপায় আছে , বা কোনও ডিভাইস এমনভাবে খোলা আছে যাতে এটি সংযোগ তৈরি না করে?

আমার কি করা উচিৎ?


1
বেনামে থাকা কেউ এই সম্পাদনার পরামর্শ দিয়েছিলেন, যা প্রত্যাখ্যান করা হয়েছিল, তাই আমি পরিবর্তে এটি একটি মন্তব্য হিসাবে এখানে রেখেছি: আপনি যদি TIOCGSERIAL পতাকাটি আইওসিটিএল কলটিতে ব্যবহার করেন, তবে টিওসিএমজিইটির পরিবর্তে কলটি কিছু ভুল পাথ দিয়ে ত্রুটি ফিরিয়ে দেয় না যা না একটি COM (সিরিয়াল) পোর্ট পড়ুন। TIOCMGET পতাকা সহ, আইওএসটিএল কেবলমাত্র টিটিওয়াই এবং টিটিওয়াইএসবি সম্ভাব্য পাথগুলিতে অ্যাক্সেসের জন্য উপলব্ধ সিওএম বন্দরগুলির সাথে কাজ করে।
টমাস টেম্পেলম্যান

উত্তর:


78

/sysফাইলসিস্টেম আপনার কোয়েস্টের জন্য প্রচুর তথ্য থাকা উচিত। আমার সিস্টেম (2.6.32-40-জেনেরিক # 87-উবুন্টু) পরামর্শ দেয়:

/sys/class/tty

যা আপনাকে সিস্টেমে পরিচিত সমস্ত টিটিওয়াই ডিভাইসের বিবরণ দেয়। একটি ছাঁটা ডাউন উদাহরণ:

# ll /sys/class/tty/ttyUSB*
lrwxrwxrwx 1 root root 0 2012-03-28 20:43 /sys/class/tty/ttyUSB0 -> ../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.0/ttyUSB0/tty/ttyUSB0/
lrwxrwxrwx 1 root root 0 2012-03-28 20:44 /sys/class/tty/ttyUSB1 -> ../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/ttyUSB1/tty/ttyUSB1/

এই লিঙ্কগুলির মধ্যে একটি অনুসরণ:

# ll /sys/class/tty/ttyUSB0/
insgesamt 0
drwxr-xr-x 3 root root    0 2012-03-28 20:43 ./
drwxr-xr-x 3 root root    0 2012-03-28 20:43 ../
-r--r--r-- 1 root root 4096 2012-03-28 20:49 dev
lrwxrwxrwx 1 root root    0 2012-03-28 20:43 device -> ../../../ttyUSB0/
drwxr-xr-x 2 root root    0 2012-03-28 20:49 power/
lrwxrwxrwx 1 root root    0 2012-03-28 20:43 subsystem -> ../../../../../../../../../../class/tty/
-rw-r--r-- 1 root root 4096 2012-03-28 20:43 uevent

এখানে devফাইলটিতে এই তথ্য রয়েছে:

# cat /sys/class/tty/ttyUSB0/dev
188:0

এটি প্রধান / গৌণ নোড। /devব্যবহারকারী-বান্ধব নামগুলি পেতে এগুলি ডিরেক্টরিতে অনুসন্ধান করা যেতে পারে :

# ll -R /dev |grep "188, *0"
crw-rw----   1 root dialout 188,   0 2012-03-28 20:44 ttyUSB0

/sys/class/ttyDir সব পির TTY ডিভাইসের ধারণ করে কিন্তু আপনি যারা বিরক্তিকর ভার্চুয়াল টার্মিনাল এবং ছদ্ম টার্মিনাল বাদ দেওয়ার বিষয়ে হতে পারে। আমি আপনাকে পরামর্শ দিচ্ছি যে কেবলমাত্র যাদের device/driverপ্রবেশ রয়েছে:

# ll /sys/class/tty/*/device/driver
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS0/device/driver -> ../../../bus/pnp/drivers/serial/
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS1/device/driver -> ../../../bus/pnp/drivers/serial/
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS2/device/driver -> ../../../bus/platform/drivers/serial8250/
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS3/device/driver -> ../../../bus/platform/drivers/serial8250/
lrwxrwxrwx 1 root root 0 2012-03-28 20:43 /sys/class/tty/ttyUSB0/device/driver -> ../../../../../../../../bus/usb-serial/drivers/ftdi_sio/
lrwxrwxrwx 1 root root 0 2012-03-28 21:15 /sys/class/tty/ttyUSB1/device/driver -> ../../../../../../../../bus/usb-serial/drivers/ftdi_sio/

@entalpi আপনি পাবেন /dev/zero। আপনি কি সত্যিই ভাবেন, এটি একটি সিরিয়াল ডিভাইস?
এএইচ

/ ডিভাইস অনুসন্ধান অনর্থক, যেহেতু আপনি ইতিমধ্যে / সাইস / শ্রেণি / টিটি-তে নাম রেখেছেন (ডিফল্ট হিসাবে উদেব / দেব / ডিভিএনএম নোড তৈরি করে)। আপনি যা সম্পর্কে আগ্রহী তা হ'ল / ডিভ মধ্যে থাকা কোনও "প্রতীকী" লিঙ্ক যা এই জাতীয় ডিভাইসে নির্দেশ করে। এটি খুঁজে পাওয়া অনেক বেশি কঠিন।
xryl669

28

সাম্প্রতিক কার্নেলগুলিতে (কখন থেকে নিশ্চিত নয়) আপনি আপনার সিস্টেমে সিরিয়াল পোর্টগুলির একটি তালিকা পেতে / dev / সিরিয়ালের বিষয়বস্তু তালিকাভুক্ত করতে পারেন। এগুলি প্রকৃতপক্ষে সঠিক / দেব / নোডের প্রতি নির্দেশিত প্রতিলিঙ্কগুলি:

flu0@laptop:~$ ls /dev/serial/
total 0
drwxr-xr-x 2 root root 60 2011-07-20 17:12 by-id/
drwxr-xr-x 2 root root 60 2011-07-20 17:12 by-path/
flu0@laptop:~$ ls /dev/serial/by-id/
total 0
lrwxrwxrwx 1 root root 13 2011-07-20 17:12 usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0 -> ../../ttyUSB0
flu0@laptop:~$ ls /dev/serial/by-path/
total 0
lrwxrwxrwx 1 root root 13 2011-07-20 17:12 pci-0000:00:0b.0-usb-0:3:1.0-port0 -> ../../ttyUSB0

এটি একটি ইউএসবি-সিরিয়াল অ্যাডাপ্টার, যেমন আপনি দেখতে পাচ্ছেন। নোট করুন যখন সিস্টেমে কোনও সিরিয়াল পোর্ট নেই তখন / dev / সিরিয়াল / ডিরেক্টরি উপস্থিত থাকে না। আশাকরি এটা সাহায্য করবে :).


3
এটি ইউদেভের একটি ফাংশন (বিশেষত এর কনফিগারেশনটি /lib/udev/rules.d/??-persistance-serial.rules) এর মধ্যে রয়েছে, যা 2.5 এ চালু হয়েছিল।
এরগোসিস

4
দুর্দান্ত টিপ! দুর্ভাগ্যক্রমে আমি মনে করি না এটি সিরিয়াল পোর্টগুলিতে নির্মিত দেখানো হবে, কেবল ইউএসবি সিরিয়াল পোর্ট (সংযুক্ত হওয়ার পরে উদেব দ্বারা দেখা হবে)। আমি কোনও ভিএমওয়্যার ভিএম-তে উবুন্টু 14-তে / দেব / সিরিয়ালের জন্য কিছুই দেখতে পাচ্ছি না (টিএমটিএস 0 / ভিএম দ্বারা সরবরাহিত সিওএম 1 সহ), এবং উদেব বিধিগুলি (60-ধ্রুবক-সিরিয়াল.রুলস) কেবল উদেব ডিভাইসগুলিতে দেখছে - আমি মনে করি না যে উদেব "বিল্ট ইন" টিটিএসএস * সিরিয়াল পোর্টগুলি সম্পর্কে সন্ধান করেছেন, তাদের আইওসিটিএল বা অন্য উত্তরের মতোই পরীক্ষা করতে হবে।
রিড হেজেস

ls / dev / সিরিয়াল / ls: '/ dev / সিরিয়াল /' অ্যাক্সেস করতে পারবেন না:
সের্কওয়্যার

2
@ জেপকা: এটির জন্য যদি কোনও সিরিয়াল ডিভাইস না থাকে। আমি উপরের মতো করেছিলাম এবং এটি কাজ করে। আমি তখন ইউএসবি থেকে আমার (এফটিডিডিআই) সিরিয়াল ডিভাইসটি আনপ্লাগড করেছিলাম এবং এরপরে এটি আপনার বর্ণিত ত্রুটিটি উত্পন্ন করে।
ওয়ার্পস্পেস

13

আমি নিম্নলিখিত কোড মত কিছু করছি। এটি ইউএসবি-ডিভাইসগুলির জন্য এবং মূ serial় সিরিয়াল 8250-ডিভাইসগুলির জন্যও কাজ করে যা আমাদের সকলের মধ্যে 30 টি রয়েছে - তবে তাদের মধ্যে দু'টি বাস্তব কাজ করে।

মূলত আমি পূর্ববর্তী উত্তরগুলি থেকে ধারণাটি ব্যবহার করি। প্রথমে / sys / শ্রেণী / tty / তে সমস্ত tty- ডিভাইস গণনা করুন। যে ডিভাইসগুলিতে / ডিভাইস সাবডির থাকে না সেগুলি ফিল্টার করে দেওয়া হয়। / sys / শ্রেণী / tty / কনসোল একটি ডিভাইস। তারপরে সেই ডিভাইসগুলি আসলে ড্রাইভার-সিএমলিঙ্ক এফএক্স এর লক্ষ্য অনুসারে বৈধ সিরিয়াল-পোর্ট হিসাবে স্বীকৃত ছিল।

$ ls -al /sys/class/tty/ttyUSB0//device/driver
lrwxrwxrwx 1 root root 0 sep  6 21:28 /sys/class/tty/ttyUSB0//device/driver -> ../../../bus/platform/drivers/usbserial

এবং ttyS0 এর জন্য

$ ls -al /sys/class/tty/ttyS0//device/driver
lrwxrwxrwx 1 root root 0 sep  6 21:28 /sys/class/tty/ttyS0//device/driver -> ../../../bus/platform/drivers/serial8250

সিরিয়াল 8250 দ্বারা চালিত সমস্ত ড্রাইভারের অবশ্যই পূর্বে উল্লিখিত ioctl ব্যবহার করে প্রোব হওয়া উচিত।

        if (ioctl(fd, TIOCGSERIAL, &serinfo)==0) {
            // If device type is no PORT_UNKNOWN we accept the port
            if (serinfo.type != PORT_UNKNOWN)
                the_port_is_valid

বৈধ ডিভাইস-ধরণের প্রতিবেদন করা কেবল পোর্ট বৈধ।

সিরিয়ালগুলি গণনা করার সম্পূর্ণ উত্সটি দেখতে দেখতে এ জাতীয় দেখাচ্ছে। সংযোজনগুলি স্বাগত।

#include <stdlib.h>
#include <dirent.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <linux/serial.h>

#include <iostream>
#include <list>

using namespace std;

static string get_driver(const string& tty) {
    struct stat st;
    string devicedir = tty;

    // Append '/device' to the tty-path
    devicedir += "/device";

    // Stat the devicedir and handle it if it is a symlink
    if (lstat(devicedir.c_str(), &st)==0 && S_ISLNK(st.st_mode)) {
        char buffer[1024];
        memset(buffer, 0, sizeof(buffer));

        // Append '/driver' and return basename of the target
        devicedir += "/driver";

        if (readlink(devicedir.c_str(), buffer, sizeof(buffer)) > 0)
            return basename(buffer);
    }
    return "";
}

static void register_comport( list<string>& comList, list<string>& comList8250, const string& dir) {
    // Get the driver the device is using
    string driver = get_driver(dir);

    // Skip devices without a driver
    if (driver.size() > 0) {
        string devfile = string("/dev/") + basename(dir.c_str());

        // Put serial8250-devices in a seperate list
        if (driver == "serial8250") {
            comList8250.push_back(devfile);
        } else
            comList.push_back(devfile); 
    }
}

static void probe_serial8250_comports(list<string>& comList, list<string> comList8250) {
    struct serial_struct serinfo;
    list<string>::iterator it = comList8250.begin();

    // Iterate over all serial8250-devices
    while (it != comList8250.end()) {

        // Try to open the device
        int fd = open((*it).c_str(), O_RDWR | O_NONBLOCK | O_NOCTTY);

        if (fd >= 0) {
            // Get serial_info
            if (ioctl(fd, TIOCGSERIAL, &serinfo)==0) {
                // If device type is no PORT_UNKNOWN we accept the port
                if (serinfo.type != PORT_UNKNOWN)
                    comList.push_back(*it);
            }
            close(fd);
        }
        it ++;
    }
}

list<string> getComList() {
    int n;
    struct dirent **namelist;
    list<string> comList;
    list<string> comList8250;
    const char* sysdir = "/sys/class/tty/";

    // Scan through /sys/class/tty - it contains all tty-devices in the system
    n = scandir(sysdir, &namelist, NULL, NULL);
    if (n < 0)
        perror("scandir");
    else {
        while (n--) {
            if (strcmp(namelist[n]->d_name,"..") && strcmp(namelist[n]->d_name,".")) {

                // Construct full absolute file path
                string devicedir = sysdir;
                devicedir += namelist[n]->d_name;

                // Register the device
                register_comport(comList, comList8250, devicedir);
            }
            free(namelist[n]);
        }
        free(namelist);
    }

    // Only non-serial8250 has been added to comList without any further testing
    // serial8250-devices must be probe to check for validity
    probe_serial8250_comports(comList, comList8250);

    // Return the lsit of detected comports
    return comList;
}


int main() {
    list<string> l = getComList();

    list<string>::iterator it = l.begin();
    while (it != l.end()) {
        cout << *it << endl;
        it++;
    }

    return 0;   
}

লোন লিঙ্কটি একটি দুর্বল উত্তর হিসাবে বিবেচিত হয় কারণ এটি নিজেই অর্থহীন এবং লক্ষ্য সংস্থান ভবিষ্যতে জীবিত থাকার গ্যারান্টিযুক্ত নয়। আপনি যে লিঙ্ক করছেন তার অন্তত সংক্ষিপ্তসার অন্তর্ভুক্ত করার চেষ্টা করুন।
j0k

এর জন্য সোরেনকে ধন্যবাদ, এমনকি আমরা এপিআই এবং এটি সম্পর্কে কিছু ধারণা জানি তবে আপনি সত্যেন ভালেন করেছেন, আবারও ধন্যবাদ।
ind79ra

12

আমি মনে করি আমি আমার কার্নেল উত্স ডকুমেন্টেশনে উত্তরটি পেয়েছি:

1.7 TTY info in /proc/tty
-------------------------

Information about  the  available  and actually used tty's can be found in the
directory /proc/tty.You'll  find  entries  for drivers and line disciplines in
this directory, as shown in Table 1-11.


Table 1-11: Files in /proc/tty
..............................................................................
 File          Content                                        
 drivers       list of drivers and their usage                
 ldiscs        registered line disciplines                    
 driver/serial usage statistic and status of single tty lines 
..............................................................................

To see  which  tty's  are  currently in use, you can simply look into the file
/proc/tty/drivers:

  > cat /proc/tty/drivers 
  pty_slave            /dev/pts      136   0-255 pty:slave 
  pty_master           /dev/ptm      128   0-255 pty:master 
  pty_slave            /dev/ttyp       3   0-255 pty:slave 
  pty_master           /dev/pty        2   0-255 pty:master 
  serial               /dev/cua        5   64-67 serial:callout 
  serial               /dev/ttyS       4   64-67 serial 
  /dev/tty0            /dev/tty0       4       0 system:vtmaster 
  /dev/ptmx            /dev/ptmx       5       2 system 
  /dev/console         /dev/console    5       1 system:console 
  /dev/tty             /dev/tty        5       0 system:/dev/tty 
  unknown              /dev/tty        4    1-63 console 

এই ফাইলে একটি লিঙ্ক এখানে দেওয়া হয়েছে: http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git ;a =blob_plain ; f= ডকুমেন্টেশন / ফাইলস সিস্টেম / প্রোক.টেক্সট ; hb = e8883f8057c0f7c9950fa9f20568f37bfa62f34a


হ্যাঁ, এটি কাজ করছে বলে মনে হচ্ছে। যাইহোক, এই সমাধানটির জন্য আমাকে একটি পাঠ্য ফাইলটি পড়তে এবং পার্স করা প্রয়োজন। আমি অবাক হয়েছি যদি এর থেকেও ভাল কিছু থাকে, তবে এমন একটি API যা আমাকে এই সামগ্রীগুলি কাঠামোগত বাইনারি ফর্ম্যাটে আনতে দেয়।
থমাস টেম্পেলম্যান


3

-সি বিকল্পের সাথে সেটসিরিয়ালটি আপনি যা চান তা করতে প্রদর্শিত হয় এবং সি উত্সটি http://www.koders.com/c/fid39344DABD14604E70DF1B8FEA7D920A94AF78BF8.aspx এ উপলব্ধ ।


আমি কোডটি দেখলাম এবং এর শেষে আমি আমার প্রশ্নে ত্রুটিটি ব্যাখ্যা করেছি কারণ এটিতে ডিভাইসটি খুলতে হবে, যা ইতিমধ্যে সংযোগের প্রচেষ্টা চালিয়ে যেতে পারে - যার ফলে এটি ভাল নয় not তবে, সম্ভবত ব্লুটুথ সমর্থনের ক্ষেত্রে লিনাক্স ড্রাইভাররা বর্তমান ওএসএক্স ড্রাইভারের চেয়ে বেশি স্মার্ট, কারণ তারা এখনই সংযোগটি খুলবে না? কে জানে? বিশেষভাবে এটি স্পষ্ট করার জন্য আমার একটি নতুন প্রশ্ন শুরু করা উচিত। যদি এটি সক্রিয় হয় যে এটি ঠিক আছে তবে আমি আপনার উত্তরটি এখানেও গ্রহণ করতে পারি।
হুম

3

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

import dbus
bus = dbus.SystemBus()
hwmanager = bus.get_object('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager')
hwmanager_i = dbus.Interface(hwmanager, 'org.freedesktop.Hal.Manager')
print hwmanager_i.FindDeviceByCapability("serial")

যদি এটি ব্যর্থ হয় তবে আপনি ভিতরে সন্ধান করতে পারবেন hwmanager_i.GetAllDevicesWithProperties()যে সক্ষমতাটির নাম "সিরিয়াল" যা আমি সবেমাত্র অনুমান করেছি তার আলাদা নাম আছে কিনা।

আছে HTH


2

আমার কাছে ইউএসবি সিরিয়াল ডিভাইস নেই, তবে সরাসরি এইচএল লাইব্রেরি ব্যবহার করে সত্যিকারের বন্দরগুলি খুঁজে পাওয়ার একটি উপায় থাকতে হবে:

====================================================================
#! /usr/bin/env bash
#
# Uses HAL to find existing serial hardware
#

for sport in $(hal-find-by-capability --capability serial) ; do
  hal-get-property --udi "${sport}" --key serial.device
done

====================================================================

পোস্ট করা পাইথন-ডিবিএস কোড বা এই শ স্ক্রিপ্টটি ব্লুটুথ / ডিভ / আরএফকোম * ডিভাইসগুলি তালিকাভুক্ত করে, সুতরাং এটি সর্বোত্তম সমাধান নয়।

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


খুব খারাপ এইচএল উবুন্টু থেকে সরানো হয়েছে (12.04 এর পরে), এটিতে খুব সহজেই ব্যবহার করার সহজ সরঞ্জাম ছিল। উপরের প্রতিস্থাপন আছে কি কেউ জানেন? তবে আপনি যদি এমন কোনও সংস্করণে / ডিস্ট্রোতে থাকেন যা এইচএএল আছে এটি দুর্দান্ত দেখাচ্ছে।
রিড হেজেস

2

/ Proc / tty / ড্রাইভার ব্যবহার কেবলমাত্র tty ড্রাইভার লোড করা হয় তা নির্দেশ করে। আপনি যদি সিরিয়াল বন্দরগুলির জন্য / ডিভ / সিরিয়াল চেক আউটগুলির একটি তালিকা খুঁজছেন তবে এটিতে দুটি উপ-ডিরেক্টরি থাকবে: বাই আইডি এবং বাই-পাথ।

গো EX:

# find . -type l
./by-path/usb-0:1.1:1.0-port0
./by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0

এই পোস্টে ধন্যবাদ: /superuser/131044/how-do-i-know-Wich-dev-ttys-is-my-seial-port


স্পষ্টতই এটি ডিস্ট্রো-নির্ভর। আমি আমার বাক্সে / দেব / সিরিয়ালটি খুঁজে পাচ্ছি না (
দেবিয়ান

0

প্রতিটি ডায়ালআউট ব্যবহারকারীর সাথে প্রতিটি ডায়ালআউট পেতে কেবলমাত্র তার ফোল্ডারটি পেতে গ্রুপ ডায়ালআউটের মাধ্যমে আমার পন্থাls -l /dev/tty* | grep 'dialout'ls -l /dev/tty* | grep 'dialout' | rev | cut -d " " -f1 | rev

tty আউটপুট যেমন সহজেই অর্ডিনো সিরিয়াল আউট: head --lines 1 < /dev/ttyUSB0

প্রত্যেকটি টিটি কেবল একটি লাইনের জন্য শুনুন: for i in $(ls -l /dev/tty* | grep 'dialout' | rev | cut -d " " -f1 | rev); do head --lines 1 < $i; done

ড্রাইভারের সন্ধানের মাধ্যমে আমি পদ্ধতির পছন্দ করি: ll /sys/class/tty/*/device/driver

আপনি এখন tty- নাম চয়ন করতে পারেন: ls /sys/class/tty/*/device/driver | grep 'driver' | cut -d "/" -f 5


0

সিরিয়াল যোগাযোগ ম্যানেজার লাইব্রেরিতে অনেকগুলি এপিআই এবং বৈশিষ্ট্যগুলি রয়েছে যা আপনি চান সেই কাজের জন্য লক্ষ্যযুক্ত। ডিভাইসটি যদি ইউএসবি-ইউআর্ট হয় তবে এর ভিআইডি / পিআইডি ব্যবহার করা যেতে পারে। ডিভাইসটি বিটি-এসপিপি থাকলে প্ল্যাটফর্মের জন্য নির্দিষ্ট এপিআই ব্যবহার করা যেতে পারে। সিরিয়াল বন্দর প্রোগ্রামিংয়ের জন্য এই প্রকল্পটি একবার দেখুন: https://github.com/RishiGapt12/serial-communication-manager


0

হ্যাঁ, আমি জানি, আমি অনেক দেরিতে (বরাবরের মতো) এখানে আমার কোডের টুকরো (এমকে 2 এর উত্তরের ভিত্তিতে)। হতে পারে এটি কাউকে সহায়তা করে:

std::vector<std::string> find_serial_ports()
{
 std::vector<std::string> ports;
    std::filesystem::path kdr_path{"/proc/tty/drivers"};
    if (std::filesystem::exists(kdr_path))
    {
        std::ifstream ifile(kdr_path.generic_string());
        std::string line;
        std::vector<std::string> prefixes;
        while (std::getline(ifile, line))
        {
            std::vector<std::string> items;
            auto it = line.find_first_not_of(' ');
            while (it != std::string::npos)
            {

                auto it2 = line.substr(it).find_first_of(' ');
                if (it2 == std::string::npos)
                {
                    items.push_back(line.substr(it));
                    break;
                }
                it2 += it;
                items.push_back(line.substr(it, it2 - it));
                it = it2 + line.substr(it2).find_first_not_of(' ');
            }
            if (items.size() >= 5)
            {
                if (items[4] == "serial" && items[0].find("serial") != std::string::npos)
                {
                    prefixes.emplace_back(items[1]);
                }
            }
        }
        ifile.close();
        for (auto& p: std::filesystem::directory_iterator("/dev"))
        {
            for (const auto& pf : prefixes)
            {
                auto dev_path = p.path().generic_string();
                if (dev_path.size() >= pf.size() && std::equal(dev_path.begin(), dev_path.begin() + pf.size(), pf.begin()))
                {
                    ports.emplace_back(dev_path);
                }
            }
        }
    }
    return ports;
}

এটা তোলে আপনার কোড পার্স মনে হচ্ছে, কি উত্তর stackoverflow.com/a/4701610/43615 বোঝায়। যদি তা হয় তবে আপনার জবাবে আপনি তা উল্লেখ করবেন, দয়া করে?
টমাস টেম্পেলম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.