سؤال

في .صافي SerialPort كائن, هل هناك طريقة لتحديد ما إذا كان المنفذ التسلسلي يحصل موصول أو في الوتر.

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

المحلول

وعلى عكس USB، ليس لديها منفذ تسلسلي بأي شكل من الأشكال المدمج في الكشف عن تغير مادي في حالة الارتباط. وهناك شكل محدود من "جهاز جاهزة / يست مستعدة" يمكن أن يتم الإشارة باستخدام بعض دبابيس (أي DTR، DSR، وأحيانا DCD)، ولكن هذا لا يبدو وكأنه بالضبط ما كنت تبحث عن (انها لم تبن في إلى RS232 - الجهاز يجب أن يدعم ذلك، يمكنك استخدام أساسا لاجراء محادثات مع أجهزة المودم)

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

نصائح أخرى

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

أنا لم أجربها ولكن انظروا SerialPort.PinChanged الحدث DsrChanged.

كلما كان هناك أي عادي الجهاز توصيله إلى منفذ تسلسلي ووجوده ، ثم أتوقع الميناء DSR pin أكد;وعلى العكس من ذلك إذا كان هذا الجهاز غير موصول ، أو عندما يكون مغلقا ، ثم أتوقع DSR دبوس الدولة إلى تغيير/drop.


المعتاد معنى مختلف دبابيس هو:

  • DSR:جهاز توصيل و تشغيل
  • CTS:الجهاز جاهز لاستقبال البيانات (قد يكون هذا حتى عند توصيل جهاز ، على سبيل المثال ، عندما يكون الجهاز محدودة على متن العازلة ويستخدم هذا الرقم في التدفق-التحكم في نقل البيانات من جهاز الكمبيوتر)
  • DCD:جهاز (المودم) بإنشاء اتصال عبر خط الهاتف إلى مودم آخر (حتى أي شيء يمكنك إرسال يتم التعامل مع البيانات التي يتم نقلها إلى جهاز التحكم عن بعد المودم)

هذه أحد أن يجيب على البروتوكول الاختياري الخاص بك هو DSR.

هناك هو طريقة الكشف عن المنفذ التسلسلي إزالة/الإدراج في .صافي - انظر جوابي في الكشف عن المنفذ التسلسلي الإدراج/إزالة

    Public Class SerialPort
        Inherits IO.Ports.SerialPort

        Event Disconnected()

        Public Sub OpenWithDisconnectionevent()
            Me.Open()
            Dim t As New Threading.Thread(AddressOf ConnectivityChecker)
            t.Start()
        End Sub


        Sub ConnectivityChecker()
            Do
                If Me.IsOpen = False Then
                    RaiseEvent Disconnected()
                    GoTo ThreadExit
                End If
            Loop
ThreadExit:
        End Sub
    End Class

ويمكنك اكتشاف availables المنافذ التسلسلية، ويمكنك محاولة التواصل معهم داخل محاولة ... كتلة الصيد.

وهذا مثال للكشف الموانئ في ج #

using System;
using System.Collections.Generic;
using System.IO.Ports;

public class MyClass
{
 public static void Main()
 {
   string[] sPorts = SerialPort.GetPortNames();
   foreach(string port in sPorts)
     WL(port);
  RL();
 }

 #region Helper methods

 private static void WL(object text, params object[] args)
 {
  Console.WriteLine(text.ToString(), args); 
 }

 private static void RL()
 {
  Console.ReadLine(); 
 }

 private static void Break()
 {
  System.Diagnostics.Debugger.Break();
 }

 #endregion
}

وهذا يتوقف على نوع الجهاز الذي ربط مع أي نوع من الكابلات.

وأفضل رهان هو محاولة التعامل مع معالج الحدث PinChanged.

سوف

وبعض أجهزة رفع DSR عند توصيله وتشغيله، والبعض الآخر CTS، والبعض الآخر سوف تستخدم هذه المصافحة.

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