লিনাক্স সিস্টেমে সমস্ত উপলব্ধ সিরিয়াল পোর্ট / ডিভাইসগুলির তালিকা পাওয়ার সঠিক উপায় কী?
অন্য কথায়, আমি যখন সমস্ত ডিভাইসগুলিতে প্রবেশ করি তখন আমি /dev/
কীভাবে বলব যে কোনগুলি ধ্রুপদী উপায়ে সিরিয়াল বন্দর হয়, যা সাধারণত বাউড রেট এবং আরটিএস / সিটিএস ফ্লো নিয়ন্ত্রণকে সমর্থন করে?
সমাধান সি এ কোড করা হবে।
আমি জিজ্ঞাসা করছি কারণ আমি একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করছি যা এটি পরিষ্কারভাবে ভুল করে: এটি কেবল পুনরাবৃত্তি হবে বলে মনে হয় /dev/ttyS*
। সমস্যাটি হ'ল উদাহরণস্বরূপ, ইউএসবি-র মাধ্যমে সিরিয়াল পোর্ট রয়েছে (ইউএসবি-আরএস 232 অ্যাডাপ্টারের দ্বারা সরবরাহিত) এবং সেগুলি / dev / ttyUSB * এর অধীনে তালিকাভুক্ত করা হয়েছে। এবং লিনাক্স.আরজে সিরিয়াল-হাওটো পড়তে , আমি ধারণা পেয়েছি যে সময় আসার সাথে সাথে অন্য নামের জায়গাগুলিও থাকবে।
সুতরাং সিরিয়াল ডিভাইসগুলি সনাক্ত করার জন্য আমার সরকারী উপায়টি খুঁজে বের করা উচিত। সমস্যাটি হ'ল কোনওটিই নথিভুক্ত বলে মনে হয় না, বা আমি এটি খুঁজে পাই না।
আমি কল্পনা করি এর একটি উপায় হ'ল সমস্ত ফাইল খুলতে হবে /dev/tty*
এবং সেগুলিতে একটি নির্দিষ্ট কল করা ioctl()
হবে যা কেবল সিরিয়াল ডিভাইসে উপলব্ধ। যদিও এটি একটি ভাল সমাধান হতে পারে?
হালনাগাদ
হিকার্ডস "সেটসিরিয়াল" এর উত্সটি দেখার পরামর্শ দিয়েছিলেন। এর কোডটি ঠিক আমার মনের মতো করে:
প্রথমত, এটি এর সাথে একটি ডিভাইস খোলে:
fd = open (path, O_RDWR | O_NONBLOCK)
তারপরে এটি আহবান করে:
ioctl (fd, TIOCGSERIAL, &serinfo)
যদি সেই কলটি কোনও ত্রুটি না দেয় তবে স্পষ্টতই এটি সিরিয়াল ডিভাইস।
সিরিয়াল প্রোগ্রামিং / টের্মিওসে আমি অনুরূপ কোড পেয়েছি , যা O_NOCTTY
বিকল্পটি যোগ করার পরামর্শ দেয় ।
এই পদ্ধতির সাথে একটি সমস্যা রয়েছে, যদিও:
আমি যখন BSD ইউনিক্সে (যা ম্যাক ওএস এক্স) এই কোডটি পরীক্ষা করেছিলাম তখন এটি কাজ করে। যাইহোক , ব্লুটুথের মাধ্যমে সরবরাহ করা সিরিয়াল ডিভাইসগুলি সিস্টেম (ড্রাইভার) ব্লুটুথ ডিভাইসের সাথে সংযোগ স্থাপনের চেষ্টা করে, এটি একটি সময়সীমা ত্রুটির সাথে ফিরে আসার আগে কিছুটা সময় নেয়। এটি কেবলমাত্র ডিভাইস খোলার কারণে ঘটে। এবং আমি কল্পনা করতে পারি যে লিনাক্সেও একই রকম ঘটনা ঘটতে পারে - আদর্শভাবে, ডিভাইসটির ধরণটি বের করার জন্য আমার খোলার দরকার নেই। আমি অবাক হয়েছি যদি সেখানে ioctl
একটি খোলা ছাড়াই ফাংশন আহ্বান করার কোনও উপায় আছে , বা কোনও ডিভাইস এমনভাবে খোলা আছে যাতে এটি সংযোগ তৈরি না করে?
আমার কি করা উচিৎ?