Pregunta

En SerialPort objeto de .Net, ¿hay una manera de determinar si un puerto serie se desenchufa o enchufado.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top