سؤال

أحتاج إلى اختبار تطبيق منفذ تسلسلي على Linux، ومع ذلك، جهاز الاختبار الخاص بي يحتوي على منفذ تسلسلي واحد فقط.

هل هناك طريقة لإضافة منفذ تسلسلي افتراضي إلى Linux واختبار التطبيق الخاص بي عن طريق محاكاة جهاز من خلال shell أو برنامج نصي؟

ملحوظة:لا يمكنني إعادة تعيين المنفذ، فهو مشفر على ttys2 وأحتاج إلى اختبار التطبيق كما هو مكتوب.

هل كانت مفيدة؟

المحلول

يمكنك استخدام pty ("المُبرِقة الزائفة"، حيث يكون المنفذ التسلسلي "مُبرِقة حقيقية") لهذا الغرض.من جهة واحدة، مفتوحة /dev/ptyp5, ، ثم قم بإرفاق البرنامج الخاص بك إلى /dev/ttyp5; ttyp5 سيعمل تمامًا مثل المنفذ التسلسلي، ولكنه سيرسل/يستقبل كل ما يفعله عبر /dev/ptyp5.

إذا كنت في حاجة إليها حقًا للتحدث إلى ملف يسمى /dev/ttys2, ، ثم قم ببساطة بنقل جهازك القديم /dev/ttys2 بعيدًا عن الطريق وقم بإنشاء رابط رمزي من ptyp5 ل ttys2.

بالطبع يمكنك استخدام رقم آخر غير ptyp5.ربما اختر واحدة ذات رقم كبير لتجنب التكرارات، نظرًا لأن جميع محطات تسجيل الدخول الخاصة بك ستستخدم ptys أيضًا.

تحتوي ويكيبيديا على المزيد حول ptys: http://en.wikipedia.org/wiki/Pseudo_terminal

نصائح أخرى

استكمالا لإجابة @ slonik.

يمكنك اختبار socat لإنشاء منفذ تسلسلي افتراضي باتباع الإجراء التالي (تم اختباره على Ubuntu 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 وسترى السلسلة "اختبار".

استخدم socat لهذا:

على سبيل المثال:

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

هناك أيضًا tty0tty http://sourceforge.net/projects/tty0tty/ وهو محاكي مودم حقيقي لنظام التشغيل Linux.

إنها وحدة نواة بسيطة - ملف مصدر صغير.لا أعرف لماذا حصل هذا فقط على إعجاب على sourceforge، لكنه يعمل بشكل جيد بالنسبة لي.أفضل ما في الأمر هو أنه يحاكي أيضًا دبابيس الأجهزة (RTC/CTS DSR/DTR).حتى أنه ينفذ أوامر TIOCMGET/TIOCMSET وTIOCMIWAIT iotcl!

في نواة حديثة قد تحصل على أخطاء في الترجمة.هذا هو السهل تحديد.ما عليك سوى إدراج بضعة أسطر في أعلى مصدر الوحدة/tty0tty.c (بعد التضمين):

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

عندما يتم تحميل الوحدة، فإنها تقوم بإنشاء 4 أزواج من المنافذ التسلسلية.الأجهزة هي /dev/tnt0 إلى /dev/tnt7 حيث يتصل tnt0 بـ tnt1، ويتصل tnt2 بـ tnt3، وما إلى ذلك.قد تحتاج إلى إصلاح أذونات الملف لتتمكن من استخدام الأجهزة.

يحرر:

أعتقد أنني كنت سريعًا بعض الشيء مع حماسي.وبينما يبدو السائق واعداً، فإنه يبدو غير مستقر.لا أعرف على وجه اليقين ولكن أعتقد أنها تعطلت آلة في المكتب الذي كنت أعمل عليه من المنزل.لا أستطيع التحقق حتى أعود إلى المكتب يوم الاثنين.

الشيء الثاني هو أن TIOCMIWAIT لا يعمل.يبدو أن الكود قد تم نسخه من بعض نماذج التعليمات البرمجية "tty الصغيرة".يبدو أن معالجة TIOCMIWAIT في مكانها الصحيح، ولكنها لا تنشط أبدًا لأن الاستدعاء المقابل لـ Wake_up_interruptible() مفقود.

يحرر:

لقد كان الحادث الذي وقع في المكتب خطأ السائق حقًا.كانت هناك عملية تهيئة مفقودة، وتسبب رمز TIOCMIWAIT الذي لم يتم اختباره بالكامل في تعطل الجهاز.

قضيت أمس واليوم إعادة كتابة السائق.كان هناك الكثير من المشاكل، ولكن الآن يعمل بشكل جيد بالنسبة لي.لا يزال هناك رمز مفقود للتحكم في تدفق الأجهزة الذي يديره برنامج التشغيل، لكنني لست بحاجة إليه لأنني سأدير المسامير بنفسي باستخدام TIOCMGET/TIOCMSET/TIOCMIWAIT من رمز وضع المستخدم.

إذا كان أي شخص مهتمًا بإصداري من الكود، أرسل لي رسالة وسأرسله لك.

قد ترغب في إلقاء نظرة على تيبو VSPDL لإنشاء منفذ تسلسلي افتراضي لنظام التشغيل Linux باستخدام برنامج تشغيل Kernel - يبدو الأمر جديدًا جدًا، وهو متاح للتنزيل الآن (إصدار تجريبي).لست متأكدًا من الترخيص في هذه المرحلة، أو ما إذا كانوا يريدون جعله متاحًا تجاريًا فقط في المستقبل.

هناك بدائل تجارية أخرى، مثل http://www.ttyredirector.com/.

في المصدر المفتوح، إعادة تسلسل (GPL) يمكنها أيضًا أن تفعل ما تريد، باستخدام Unix PTY.ينقل البيانات التسلسلية "في شكل أولي" إلى مقبس الشبكة؛يجب إجراء إعداد يشبه STTY للمعلمات الطرفية عند إنشاء المنفذ، ولا يبدو أن تغييرها لاحقًا كما هو موضح في RFC 2217 مدعوم.يجب أن تكون قادرًا على تشغيل مثيلين remserial لإنشاء مودم افتراضي مثل com0com، باستثناء أنك ستحتاج إلى إعداد سرعة المنفذ وما إلى ذلك مسبقًا.

سوكات (أيضًا GPL) يشبه نسخة موسعة من Remserial مع العديد من الخيارات الأخرى، بما في ذلك طريقة "PTY" لإعادة توجيه PTY إلى شيء آخر، والذي يمكن أن يكون مثيلًا آخر لـ Socat.بالنسبة لـ Unit tets، من المحتمل أن يكون socat أفضل من remserial لأنه يمكنك نقل الملفات مباشرةً إلى PTY.انظر مثال PTY على الصفحة الرئيسية.أ التصحيح موجود ضمن "المساهمة" لتوفير دعم RFC2217 للتفاوض بشأن إعدادات الخط التسلسلي.

باستخدام الروابط المنشورة في الإجابات السابقة، قمت بترميز مثال صغير في لغة C++ باستخدام منفذ تسلسلي افتراضي.لقد دفعت الكود إلى GitHub: https://github.com/cymait/virtual-serial-port-example .

الكود واضح بذاته.أولاً، قم بإنشاء العملية الرئيسية عن طريق تشغيل ./main master وستتم طباعتها إلى stderr الذي يستخدمه الجهاز.بعد ذلك تقوم باستدعاء ./main Slave Device، حيث يكون الجهاز هو الجهاز المطبوع في الأمر الأول.

وهذا كل شيء.لديك رابط ثنائي الاتجاه بين العمليتين.

باستخدام هذا المثال، يمكنك اختبار التطبيق عن طريق إرسال جميع أنواع البيانات ومعرفة ما إذا كان يعمل بشكل صحيح.

كما يمكنك دائمًا ربط الجهاز، لذلك لا تحتاج إلى إعادة ترجمة التطبيق الذي تختبره.

هل ستتمكن من استخدام محول USB->RS232؟لدي عدد قليل منهم، وهم يستخدمون برنامج تشغيل FTDI فقط.بعد ذلك، يجب أن تكون قادرًا على إعادة تسمية /dev/ttyUSB0 (أو أي شيء يتم إنشاؤه) كـ /dev/ttyS2 .

يمكنني التفكير في ثلاثة خيارات:

تنفيذ RFC 2217

آر إف سي 2217 يغطي منفذ com لمعيار TCP/IP الذي يسمح للعميل على نظام واحد بمحاكاة منفذ تسلسلي للبرامج المحلية، مع إرسال واستقبال البيانات وإشارات التحكم بشفافية إلى خادم على نظام آخر يحتوي بالفعل على المنفذ التسلسلي.وهنا أ نظرة عامة رفيعة المستوى.

ما ستفعله هو العثور على برنامج تشغيل منفذ com للعميل أو تنفيذه والذي من شأنه تنفيذ جانب العميل من النظام على جهاز الكمبيوتر الخاص بك - حيث يبدو أنه منفذ تسلسلي حقيقي ولكنه في الواقع ينقل كل شيء إلى الخادم.قد تتمكن من الحصول على برنامج التشغيل هذا مجانًا من Digi وLantronix وما إلى ذلك لدعم خوادم المنافذ التسلسلية المستقلة الخاصة بهم.

يمكنك بعد ذلك تنفيذ جانب الخادم من الاتصال محليًا في برنامج آخر - مما يسمح للعميل بالاتصال وإصدار البيانات وأوامر التحكم حسب الحاجة.

ربما لا يكون الأمر تافهًا، ولكن RFC موجود، وقد تتمكن من العثور على مشروع مفتوح المصدر ينفذ أحد جانبي الاتصال أو كليهما.

قم بتعديل برنامج تشغيل المنفذ التسلسلي لنظام التشغيل Linux

وبدلاً من ذلك، يتوفر مصدر برنامج تشغيل المنفذ التسلسلي لنظام التشغيل Linux بسهولة.خذ ذلك، وقم بإزالة أجزاء التحكم في الأجهزة، واطلب من برنامج التشغيل هذا تشغيل منفذين /dev/ttySx، كاسترجاع بسيط.ثم قم بتوصيل برنامجك الحقيقي بـ ttyS2 ومحاكيك بـ ttySx الآخر.

استخدم كابلي USB<-->تسلسليين في الاسترجاع

ولكن ما هو أسهل شيء يمكنك القيام به الآن؟أنفق 40 دولارًا على جهازي USB بمنفذ تسلسلي، وقم بتوصيلهما معًا (مودم فارغ) واحصل في الواقع على منفذين تسلسليين حقيقيين - أحدهما للبرنامج الذي تختبره، والآخر لمحاكيك.

-آدم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top