Кабель последовательного порта отключен

StackOverflow https://stackoverflow.com/questions/1059998

  •  21-08-2019
  •  | 
  •  

Вопрос

В объекте SerialPort .Net есть способ определить, отключен или подключен последовательный порт.

Это было полезно?

Решение

В отличие от USB, последовательный порт не имеет встроенного способа обнаружения физического изменения состояния соединения.Ограниченная форма сигнализации «устройство готово/не готово» может быть реализована с использованием некоторых контактов (а именно DTR, DSR и иногда DCD), но это не совсем то, что вам нужно (он не встроен в систему). на RS232 — устройство должно его поддерживать, в основном вы используете его для связи с модемами.)

Итак, вкратце:нет, в общем случае.Если вы знаете/можете запрограммировать устройство, с которым пытаетесь установить связь, и знаете, что оно будет удерживать определенный высокий уровень линии (например), вы можете опросить его в поисках высокого уровня этой линии.Но если вы подключите устройство, которое не запрограммировано на что-то подобное предсказуемое, то узнать об этом невозможно.(Некоторые устройства по умолчанию могут поддерживать высокий уровень DSR, но это ни в коем случае не беспроигрышный вариант.)

Другие советы

Большинство серийных устройств имеют некоторый тип ответа Ack на запрос. просто отправить простой запрос и ждать ответа. Если вы не получите его, устройство не существует или, по крайней мере, не отвечает.

Я не пробовал, но посмотрите SerialPort.PinChanged событие и ДсрИзменено.

Всякий раз, когда какое-либо нормальное устройство подключено к последовательному порту и включено, я ожидаю, что будет установлен вывод DSR порта;и наоборот, если это устройство отключено или когда оно выключено, я ожидаю, что состояние контакта DSR изменится/упадет.


Обычное значение различных контактов:

  • ДСР:устройство подключено и включено
  • КТС:устройство готово к приему данных (это может быть неактивно, даже если устройство подключено, напримеркогда устройство имеет ограниченный встроенный буфер и использует этот вывод для управления потоком данных при передаче с ПК)
  • ДКД:устройство (модем) установило соединение по телефонной линии с другим модемом (поэтому все, что вы отправляете, рассматривается как данные, подлежащие передаче на удаленный модем)

Из них тот, который отвечает вашему ОП, — это DSR.

Там является способ обнаружить удаление/вставку последовательного порта в .NET - см. мой ответ на Обнаружение вставки/удаления последовательного порта

    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

вы можете обнаружить доступные последовательные порты и попытаться связаться с ними внутри блока try...catch.

Это пример обнаружения портов в С#.

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