2009-06-29 30 views

Respuesta

14

A diferencia de USB, el puerto serie no tiene ninguna forma incorporada para detectar un cambio físico en el estado del enlace. Se puede hacer una forma limitada de señalización de "dispositivo listo/no listo" utilizando algunos de los pines (a saber, DTR, DSR y, a veces, DCD), pero esto no parece exactamente lo que está buscando (no está incorporado). a RS232 - el dispositivo debe soportarlo, principalmente lo usa para hablar con módems.)

Así que, en resumen: no, en el caso general. Si sabe/puede programar el dispositivo con el que está tratando de comunicarse, y sabe que mantendrá cierta línea alta (por ejemplo), puede sondearla buscando que esa línea se eleve. Pero si conecta un dispositivo que no está programado para hacer algo predecible como ese, entonces realmente no hay forma de saberlo. (Algunos dispositivos pueden mantener DSR alto por defecto, pero de ninguna manera es una apuesta segura.)

0

puede detectar los disponibles puertos serie, el que puede tratar de comunicarse con ellos en el interior un intento ... atrapar bloque.

Este es un ejemplo de 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 
} 
+1

Creo que esta forma de .Connect() en un bucle asociado al puerto para cada conexión es torpe, especialmente si quiero un buen evento impulsado SerialPortDisconnected Evento. – maxfridbe

+0

'string [] sPorts = SerialPort.GetPortNames();' no funciona porque cuando el puerto está conectado ex: 'COM1' y de lo que está desenchufado' GetPortNames' todavía informa que 'COM1' existe ... Acabo de probarlo. – MrHIDEn

1

Yo no lo he probado, pero mira el SerialPort.PinChanged evento y DsrChanged.

Cuando haya un dispositivo normal enchufado al puerto serie y encendido, entonces esperaría que el pin DSR del puerto se confirme; y, por el contrario, si ese dispositivo está desenchufado, o cuando está apagado, entonces esperaría que el estado del pin DSR cambie/disminuya.


El significado habitual de los diversos pins es:

  • DSR: el dispositivo está enchufado y encendido
  • CTS: dispositivo está listo para recibir datos (esto puede ser hacia abajo, incluso cuando una el dispositivo está enchufado, por ejemplo, cuando el dispositivo tiene una memoria intermedia limitada y utiliza este pin para transferir datos desde la PC)
  • DCD: dispositivo (módem) ha establecido una conexión a través de la línea telefónica a otro módem (por lo que todo lo que envíe se trata como datos que se transferirán t o el módem remoto)

De estos, el que responde a su OP es DSR.

+1

Verdadero si su dispositivo usa el protocolo de enlace de hardware. Muchos dispositivos no. De hecho, algunos puertos serie ni siquiera tienen esos pines conectados. –

0

Dependerá del tipo de dispositivo que conecte con qué tipo de cable.

Su mejor opción es intentar manejar el controlador de eventos PinChanged.

Algunos dispositivos levantan DSR cuando están conectados y se encienden, otros CTS, otros los usarán para el apretón de manos.

2

La mayoría de los dispositivos en serie tienen algún tipo de respuesta de respuesta a una consulta. solo envíe una consulta simple y espere la respuesta. Si no lo obtiene, el dispositivo no está allí o al menos no responde.

1

Hay es una forma de detectar la extracción/inserción del puerto serie en.NET - ver mi respuesta a Detect serial port insertion/removal

+0

El póster probablemente quería detectar si un * dispositivo * está conectado al puerto serie, no si el puerto serie está instalado en el sistema. – Zmaster

+0

@Zmaster - ¡estás tan en lo correcto! Creo que no estaba pensando de esa manera. Eliminé mi comentario, pero dejaré la respuesta aquí en caso de que alguien esté buscando la situación a la que se aplica mi respuesta. – Pat

1
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 
Cuestiones relacionadas