লিনাক্সের জন্য ভার্চুয়াল সিরিয়াল পোর্ট


128

আমার লিনাক্সে সিরিয়াল পোর্ট অ্যাপ্লিকেশন পরীক্ষা করা দরকার, তবে আমার টেস্ট মেশিনে কেবল একটি সিরিয়াল পোর্ট রয়েছে।

লিনাক্সে ভার্চুয়াল সিরিয়াল পোর্ট যুক্ত করার এবং শেল বা স্ক্রিপ্টের মাধ্যমে কোনও ডিভাইস অনুকরণ করে আমার অ্যাপ্লিকেশন পরীক্ষা করার কোনও উপায় আছে কি?

দ্রষ্টব্য: আমি বন্দরটি পুনরায় তৈরি করতে পারি না, এটি ttys2 এ হার্ড কোডড এবং লিখিত আছে বলে আমার অ্যাপ্লিকেশনটি পরীক্ষা করা দরকার।

উত্তর:


75

আপনি এর জন্য একটি পিটিআই ("সিউডো-টেলি টাইপ" ব্যবহার করতে পারেন, যেখানে সিরিয়াল বন্দরটি "সত্যিকারের টেলি টাইপ")। এক প্রান্ত থেকে, খুলুন /dev/ptyp5এবং তারপরে আপনার প্রোগ্রামটি সংযুক্ত করুন /dev/ttyp5; ttyp5কেবল সিরিয়াল পোর্টের মতো কাজ করবে, তবে এটি সমস্ত কিছু পাঠাতে / গ্রহণ করবে / dev / ptyp5 এর মাধ্যমে।

আপনি কি সত্যিই নামক একটি ফাইল সাথে কথা বলতে এটা প্রয়োজন /dev/ttys2, তারপর কেবল আপনার পুরানো সরাতে /dev/ttys2পথ থেকে এবং থেকে একটি সিমবলিক লিঙ্ক করা ptyp5থেকে ttys2

অবশ্যই আপনি ছাড়াও কিছু নম্বর ব্যবহার করতে পারেন ptyp5। ডুপ্লিকেটগুলি এড়াতে সম্ভবত একটি উচ্চ সংখ্যা সহ একটি বেছে নিন, যেহেতু আপনার সমস্ত লগইন টার্মিনালগুলিও পিটিএস ব্যবহার করবে।

উইকিপিডিয়ায় ptys সম্পর্কে আরও রয়েছে: http://en.wikedia.org/wiki/Pseudo_terminal


8
লিনাক্সে আপনি ওপেন্টি / ফর্কপি সিস্টেম কল ব্যবহার করতে পারেন। ম্যান পৃষ্ঠা
ম্যাথু স্মিথ

8
কমান্ড লাইন সরঞ্জামটি ব্যবহার করে কীভাবে ভার্চুয়াল সিরিয়াল পোর্ট জুড়ি তৈরি করবেন?
লিনজুনালিদা

8
নোট করুন যে অনেক সিরিয়াল পোর্ট প্যারামিটার, যেমন বাউড্রেট, প্যারিটি, এইচডাব্লু ফ্লো কন্ট্রোল, ক্যারেক্টার সাইজ (?) pty তে প্রয়োগ করা হয় না, সিরিয়াল ট্রান্সমিশনের ত্রুটির উপস্থিতিতে আপনার অ্যাপ্লিকেশনটি পরীক্ষা করা অসম্ভব impossible
দিমা তিস্নেক

10
এটি সহায়ক, তবে এটি "পুরাতন স্টাইল" বিএসডি সিউডো-টার্মিনালগুলি বর্ণনা করে। "নতুন স্টাইল" ইউনিক্স 98 সিউডো-টার্মিনালগুলি কিছুটা ভিন্নভাবে কাজ করে details বিশদটির জন্য ptsম্যান পৃষ্ঠাটি দেখুন।
ক্রেগ ম্যাককুইন

3
@ লাজলোপাপ আমি ক্ষমা চাইছি, আমি পুরো সময়টি শুয়ে ছিলাম
ম্যাথু স্মিথ

160

@ স্লোনিকের উত্তরটি পরিপূরক করছে।

নিম্নলিখিত পদ্ধতিটি (উবুন্টু 12.04 এ পরীক্ষা করা) করে ভার্চুয়াল সিরিয়াল পোর্ট তৈরি করতে আপনি সাকটকে পরীক্ষা করতে পারেন:

একটি টার্মিনাল খুলুন (আসুন একে টার্মিনাল 0 বলুন) এবং এটি কার্যকর করুন:

socat -d -d pty,raw,echo=0 pty,raw,echo=0

উপরের কোডটি প্রদান করে:

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/2
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/3
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs [3,3] and [5,5]

অন্য একটি টার্মিনাল খুলুন এবং লিখুন (টার্মিনাল 1):

cat < /dev/pts/2

এই কমান্ডের পোর্ট নাম পিসি অনুযায়ী পরিবর্তন করা যেতে পারে। এটি পূর্ববর্তী আউটপুট উপর নির্ভর করে।

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**2**
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**3**
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs 

আপনার হাইলাইট করা অঞ্চলটিতে উপলব্ধ নম্বরটি ব্যবহার করা উচিত।

অন্য একটি টার্মিনাল খুলুন এবং লিখুন (টার্মিনাল 2):

echo "Test" > /dev/pts/3

এখন টার্মিনাল 1 এ ফিরে যান এবং আপনি "টেস্ট" স্ট্রিংটি দেখতে পাবেন।


এটি আমার পক্ষে স্লোনিকের উত্তরের চেয়ে ভাল কাজ করেছে, কারণ এটি ভার্চুয়াল COM পোর্ট ফাইলগুলিকে স্বয়ংক্রিয়ভাবে বরাদ্দ দেয়, এবং প্রতিধ্বনিত হয় না।
gbmhunter

7
আপনি যদি link=/path/to/linkপ্রতিটি ডিভাইস-ঘোষণার পরে পুনরায় উত্পাদনযোগ্য ফাইলের নাম ব্যবহার করতে চান (প্রতিধ্বনি = 0 পরে)। এটি স্বয়ংক্রিয় পরীক্ষায় ব্যবহৃত হতে পারে। (যেমন স্লোনিক তাদের জবাব দেয়)
প্যাট্রিক বি

এটি উল্লিখিত হিসাবে ঠিক কাজ করে। এটি আমাকে ধন্যবাদ সাহায্য করেছে।
নিম 118

1
যে একটি বাস্তব সিরিয়াল পোর্ট লিঙ্ক একটি Pty তৈরি করতে: socat -d -d pty,raw,echo=0 /dev/ttyUSB5,raw,echo=0
পেঙ্গে গেঞ্জ

আমি কি /dev/ttyS0পরিবর্তে নামের মতো একটি সিরিয়াল বন্দর তৈরি করতে পারি /dev/pts/1?
মৃড

48

এর জন্য সোকট ব্যবহার করুন:

উদাহরণ স্বরূপ:

socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11

এটি আমার পক্ষে ভাল কাজ করেছে, মিনিকোমের সাথে পরীক্ষিত! দেখে মনে হচ্ছে একটি টার্মিনালের ইনপুট উভয়ের কাছে প্রতিধ্বনিত হয়েছে (সুতরাং এটি ইনপুট টার্মিনালেও আবার প্রদর্শিত হবে)।
gbmhunter

1
আমার মতো প্রতিধ্বনি আচরণ নেই ... মিনিকোমের একটি "স্থানীয় প্রতিধ্বনি" বৈশিষ্ট্য রয়েছে ... তবে এটি অক্ষম হয়ে গেলে এটি সত্যিকারের সিরিয়াল বন্দর হিসাবে ঠিক কাজ করে। বখশিশের জন্য ধন্যবাদ.
সিপিটিহ্যামার

16

এখানে রয়েছে tty0ত্তি http://sourceforge.net/projects//000// যা লিনাক্সের জন্য একটি বাস্তব নাল মডেম এমুলেটর।

এটি একটি সাধারণ কার্নেল মডিউল - একটি ছোট উত্স ফাইল। আমি জানিনা কেন এটি সোর্সফোরে কেবল থাম্বস ডাউন হয়েছিল তবে এটি আমার পক্ষে ভাল কাজ করে। এটি সম্পর্কে সর্বোত্তম জিনিসটি হ'ল হার্ডওয়্যার পিনগুলি (আরটিসি / সিটিএস ডিএসআর / ডিটিআর )ও অনুকরণ করে। এমনকি এটি টিআইওসিএমইটি / টিআইওসিএমএসইটি এবং টিআইওসিএমআইওয়াইআইটি আইওটিসিএল কমান্ড প্রয়োগ করে!

সাম্প্রতিক কার্নেলে আপনি সংকলন ত্রুটি পেতে পারেন। এই স্থির করা সহজ। মডিউল / tty0ত্তি.c উত্সের শীর্ষে কয়েকটি লাইন সন্নিবেশ করান (অন্তর্ভুক্ত করার পরে):

#ifndef init_MUTEX
#define init_MUTEX(x) sema_init((x),1)
#endif

মডিউলটি লোড হওয়ার পরে এটি 4 জোড়া সিরিয়াল পোর্ট তৈরি করে। ডিভাইসগুলি / dev / tnt0 থেকে / dev / tnt7 এ রয়েছে যেখানে tnt0 টি tnt1 এর সাথে সংযুক্ত থাকে, tnt2 টি tnt3 এর সাথে সংযুক্ত থাকে etc.

সম্পাদনা:

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

দ্বিতীয় জিনিসটি হচ্ছে টিআইওসিএমআইওয়াইআইটি কাজ করে না। কোডটি কিছু "ক্ষুদ্র tty" উদাহরণ কোড থেকে অনুলিপি করা হয়েছে বলে মনে হচ্ছে। TIOCMIWAIT- র হ্যান্ডলিংটি জায়গাটিতে মনে হচ্ছে, তবে এটি কখনই জেগে ওঠে না কারণ জাগো_আপ_ইন্টারপ্রেটিবল () এর সাথে সম্পর্কিত কলটি অনুপস্থিত।

সম্পাদনা:

অফিসে দুর্ঘটনা আসলেই ড্রাইভারের দোষ ছিল। একটি সূচনা অনুপস্থিত ছিল, এবং সম্পূর্ণরূপে অনির্ধারিত TIOCMIWAIT কোডটি মেশিনের ক্র্যাশের কারণ হয়েছিল।

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

যদি কেউ কোডটির আমার সংস্করণে আগ্রহী হন তবে আমাকে একটি বার্তা প্রেরণ করুন এবং আমি এটি আপনাকে প্রেরণ করব।


2
আমি আপনার কোডটি দেখতে আগ্রহী। টিটিটিট্টি প্রকল্পে আপনি কি এটি আবার অবদান রাখতে পারেন? তবে, আমি লিনাক্স কার্নেলের সিউডো-টার্মিনাল কোডটি উন্নত করতে দেখতে পছন্দ করব। যেমন হার্ডওয়্যার হ্যান্ডশেকিং সমর্থন এবং TIOCMIWAIT যোগ করুন add
ক্রেগ ম্যাককুইন

3
"যদি কেউ কোডটির আমার সংস্করণে আগ্রহী হন তবে আমাকে একটি বার্তা প্রেরণ করুন এবং আমি এটি আপনাকে প্রেরণ করব।" হ্যাঁ, আমি আগ্রহী! আপনি কি কোথাও এটি নির্দেশ করতে পারেন, যেমন গিটহাবের উপর?
ক্রেগ ম্যাককুইন

7
আমি ড্রাইভারটি আপলোড করেছি: github.com/pitti98/nullmodem দুঃখিত, জবাব দিতে এত দিন লেগেছে। আমি স্ট্যাকওভারফ্লোতে খুব সক্রিয় নই এবং আপনার মন্তব্যটিকে উপেক্ষা করছি!
পিটার রিমারস

না, আমি এটি লিখেছিলাম কারণ আমার এটি প্রয়োজন হয়েছিল এবং একবার আমি যা চাইছিলাম তা করার জন্য এটি যথেষ্ট ভাল হয়ে যায়। এখন এটি প্রকাশ্য, আমি আশা করি এটি অন্য কারও জন্য উপকারী এবং সম্ভবত আমি যেখানে রেখেছি সেখানে কেউ তুলে ফেলবে।
পিটার রিমার্স

8

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

অন্যান্য বাণিজ্যিক বিকল্প রয়েছে, যেমন http://www.ttyredirector.com/

ওপেন সোর্সে রিমসিরিয়াল (জিপিএল) ইউনিক্স পিটিওয়াই ব্যবহার করে আপনি যা করতে চান তা করতে পারে। এটি সিরিয়াল তথ্যটি "কাঁচা ফর্মে" একটি নেটওয়ার্ক সকেটে স্থানান্তর করে; বন্দরটি তৈরি করার সময় টার্মিনাল প্যারামিটারগুলির STTY- এর মতো সেটআপ অবশ্যই করা উচিত, পরে সেগুলি আরএফসি 2217 তে বর্ণিত মত পরিবর্তন করা সমর্থিত বলে মনে হয় না। Com0com এর মতো ভার্চুয়াল নালমোডেম তৈরি করতে আপনার দুটি রিসিমেরিয়াল দৃষ্টান্ত চালাতে সক্ষম হওয়া উচিত, ব্যতীত আপনাকে আগে থেকেই বন্দরের গতি সেট আপ করতে হবে।

সোকাট ( জিপিএলও ) হ'ল রিমসিরিয়ালের বর্ধিত রূপের মতো অনেকগুলি বিকল্পের সাথে, পিটিওয়াইকে অন্য কোনও দিকে পুনঃনির্দেশের জন্য "পিটিওয়াই" পদ্ধতি সহ, যা সোকাটের অন্য উদাহরণ হতে পারে। ইউনিট টিটের জন্য, স্যাম্যাট সম্ভবত রিসেসেরিয়ালের চেয়ে সুন্দর, কারণ আপনি সরাসরি পিটিওয়াইতে বিড়াল ফাইল করতে পারেন। ম্যানপেজে পিটিওয়াই উদাহরণ দেখুন । সিরিয়াল লাইন সেটিংস আলোচনার জন্য আরএফসি 2217 সমর্থন সরবরাহ করতে "অবদান" এর অধীনে একটি প্যাচ বিদ্যমান


6

পূর্ববর্তী উত্তরে পোস্ট করা লিঙ্কগুলি ব্যবহার করে, আমি ভার্চুয়াল সিরিয়াল পোর্ট ব্যবহার করে সি ++ তে সামান্য উদাহরণ কোড করেছিলাম। আমি কোডটি গিটহাবের মধ্যে ঠেলে দিয়েছি: https://github.com/cymait/virtual-serial-port-example

কোডটি বেশ স্ব-বর্ণনামূলক। প্রথমত, আপনি ./main মাস্টার চালিয়ে মাস্টার প্রক্রিয়া তৈরি করেন এবং এটি ডিভাইসটি ব্যবহার করে স্ট্যাডারে মুদ্রণ করবে। এর পরে, আপনি ./main ক্রীতদাস ডিভাইস চালু করেন, যেখানে ডিভাইসটি প্রথম কমান্ডে মুদ্রিত ডিভাইস।

এবং এটাই. দু'টি প্রক্রিয়ার মধ্যে আপনার দ্বি-নির্দেশমূলক লিঙ্ক রয়েছে।

এই উদাহরণটি ব্যবহার করে আপনি সমস্ত ধরণের ডেটা প্রেরণ করে আপনাকে অ্যাপ্লিকেশনটি পরীক্ষা করতে পারেন এবং দেখুন এটি সঠিকভাবে কাজ করে কিনা।

এছাড়াও, আপনি সর্বদা ডিভাইসকে সিমলিংক করতে পারেন, তাই আপনি যে অ্যাপ্লিকেশনটি পরীক্ষা করছেন সেটি পুনরায় সংকলনের প্রয়োজন হবে না।


1
(পড়ুন (এফডি, এবং ইনপুটবাইট, 1) == 1) {...} পড়া আপনার কোডে অপরিজ্ঞাত ined লেখার বিষয়টি অপরিজ্ঞাত। বন্ধ অপরিজ্ঞাত
ম্যাটিস এএসপ

4

আপনি কি ইউএসবি-> আরএস 232 অ্যাডাপ্টার ব্যবহার করতে পারবেন? আমার কয়েকটি আছে এবং তারা কেবল এফটিডিআই ড্রাইভার ব্যবহার করে। তারপরে, আপনার / dev / ttyUSB0 (বা যা কিছু তৈরি হয়) এর নাম / dev / ttyS2 হিসাবে রাখতে পারবেন should


4

আমি তিনটি বিকল্প সম্পর্কে ভাবতে পারি:

আরএফসি 2217 প্রয়োগ করুন

আরএফসি 2217 টিসিপি / আইপি স্ট্যান্ডার্ডে একটি কম পোর্টকে কভার করে যা একটি সিস্টেমের একজন ক্লায়েন্টকে স্থানীয় প্রোগ্রামগুলিতে একটি সিরিয়াল বন্দর অনুকরণ করতে দেয়, যখন অন্য সিস্টেমের কোনও সার্ভারে স্বচ্ছভাবে ডেটা এবং নিয়ন্ত্রণ সংকেত প্রেরণ এবং গ্রহণ করে যা আসলে সিরিয়াল বন্দর রয়েছে। এখানে একটি উচ্চ-স্তরের ওভারভিউ রয়েছে

আপনি যা করবেন তা হ'ল এমন কোনও ক্লায়েন্ট কম পোর্ট ড্রাইভারকে আবিষ্কার করা বা প্রয়োগ করা যা আপনার পিসিতে সিস্টেমের ক্লায়েন্টের দিকটি বাস্তবায়িত করে - এটি একটি সত্যিকারের সিরিয়াল বন্দর বলে মনে হয় তবে বাস্তবে সমস্ত কিছু সার্ভারে বন্ধ করে দেওয়া হয়। আপনি তাদের আসল স্বতন্ত্র সিরিয়াল পোর্ট সার্ভারের সমর্থনে ডিজি, ল্যান্ট্রোনিক্স ইত্যাদি থেকে বিনামূল্যে এই ড্রাইভারটি পেতে পারবেন।

তারপরে আপনি স্থানীয়ভাবে সংযোগের সার্ভার সাইডটি অন্য কোনও প্রোগ্রামে প্রয়োগ করবেন - ক্লায়েন্টকে সংযোগ স্থাপনের অনুমতি দেওয়া এবং প্রয়োজনীয়ভাবে ডেটা এবং নিয়ন্ত্রণ আদেশগুলি জারি করা।

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

লিনাক্স সিরিয়াল পোর্ট ড্রাইভারটি সংশোধন করুন

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

একটি লুপব্যাকে দুটি ইউএসবি <--> সিরিয়াল কেবল ব্যবহার করুন

তবে এখনই করা সবচেয়ে সহজ কাজ? দুটি সিরিয়াল পোর্ট ইউএসবি ডিভাইসে 40 ডলার ব্যয় করুন, তাদের একসাথে তারের করুন (নাল মডেম) এবং আসলে দুটি বাস্তব সিরিয়াল পোর্ট রয়েছে - একটি আপনি যে প্রোগ্রামটির পরীক্ষা করছেন তার জন্য একটি, আপনার সিমুলেটারের জন্য একটি।

-Adam


1
আসলে নাল মডেম ইউএসবি ইউআরটি কেবলগুলি আমার কাছে বেশ মার্জিত সমাধান বলে মনে হয় কারণ এটি উভয় স্থানীয় পরীক্ষাকে সমর্থন করে (আপনি যদি পোর্টগুলির সাথে সংক্ষিপ্ত হন তবে একটি ইউএসবি হাব পান) এবং রিমোট ডিবাগিং।
ম্যাক্সথন চ্যান

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