Кабель последовательного порта отключен
-
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, третьи — используют их для установления связи.