Puerto Serie cable desconectado
-
21-08-2019 - |
Pregunta
En SerialPort objeto de .Net, ¿hay una manera de determinar si un puerto serie se desenchufa o enchufado.
Solución
A diferencia de USB, el puerto serie no tiene ningún mecanismo incorporado para detectar un cambio físico en el estado del enlace. Una forma limitada de "dispositivo listo / no listo" de señalización se puede hacer uso de algunos de los pasadores (es decir, DTR, DSR, DCD y, a veces), pero esto no parece ser exactamente lo que está buscando (que no está construido en a RS232 -. el dispositivo debe ser compatible con él, se utiliza principalmente para hablar con módems)
Así que, en resumen: no, en el caso general. Si usted sabe / puede programar el dispositivo que está tratando de comunicarse con, y usted sabe que llevará a cabo una determinada línea de alta (por ejemplo), usted podría sondear el parecer de que la línea sea alta. Pero si se conecta un dispositivo que no está programado para hacer algo predecible así, entonces realmente no hay forma de saber. (Algunos dispositivos pueden mantener en alto DSR de forma predeterminada, pero es de ninguna manera una apuesta segura.)
Otros consejos
La mayoría de los dispositivos de serie tienen algún tipo de respuesta ACK a una consulta. acaba de enviar una consulta simple y esperar la respuesta. Si no lo consigue, el dispositivo no está allí o al menos no responder.
Yo no lo he probado, pero mira la SerialPort.PinChanged evento y DsrChanged .
Cada vez que hay cualquier dispositivo normal de enchufado al puerto serial y encendida, entonces yo esperaría pin DSR del puerto que se afirma; y por el contrario, si el dispositivo se desconecta, o cuando se apaga, entonces yo esperaría que el estado del pin DSR para cambiar de inserción / extracción.
El significado habitual de los diversos contactos es:
- DSR: el dispositivo está enchufado y encendido
- CTS: dispositivo está listo para recibir datos (esto puede ser hacia abajo, incluso cuando un dispositivo está conectado, por ejemplo, cuando el dispositivo tiene una memoria intermedia de a bordo limitada y utiliza este perno a fluir de control de la transferencia de datos desde el PC)
- DCD: dispositivo (módem) ha establecido una conexión a través de la línea telefónica a otro módem (así que cualquier cosa que envíe se trata como datos que deben transferirse al módem remoto)
De éstos, el que responde a su OP es DSR.
es una manera de detectar puerto serie extracción / inserción en .NET - véase mi respuesta a Detectar serial inserción puerto / eliminación
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
puede detectar los puertos serie disponibles, la que puede tratar de comunicarse con ellos dentro de un bloque try ... catch.
Este es un ejemplo de la detección de puertos en c #
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
}
Esto dependerá de qué tipo de dispositivo que se conecta con qué tipo de cable.
Su mejor apuesta es tratar de manejar el controlador de eventos PinChanged.
Algunos dispositivos elevarán DSR cuando está conectado y encendido, otros CTS, los demás pueden utilizar estos para el apretón de manos.