Domanda

Nel oggetto SerialPort di Net, c'è un modo per determinare se una porta seriale viene scollegato o collegato.

È stato utile?

Soluzione

A differenza di USB, la porta seriale non ha alcun modo integrato per rilevare un cambiamento fisico in stato di collegamento. Una forma limitata di "dispositivo pronto / non pronto" segnalazione può essere fatta utilizzando alcuni dei perni (cioè DTR, DSR, e talvolta DCD), ma questo non sembra esattamente quello che stai cercando (non è costruito in a RS232 -. il dispositivo deve sostenerla, si utilizza principalmente per parlare con i modem)

Così, in breve: no, nel caso generale. Se si conosce / può programmare il dispositivo si sta cercando di comunicare con, e si sa che terrà una certa linea alta (per esempio), si potrebbe sondaggio è alla ricerca di quella linea ad arrivare in alto. Ma se si collega un dispositivo che non è programmato per fare qualcosa di prevedibile così, allora non c'è davvero nessun modo per dire. (Alcuni dispositivi potrebbero tenere alto DSR per impostazione predefinita, ma è in nessun modo una scommessa sicura.)

Altri suggerimenti

La maggior parte dei dispositivi seriali hanno un qualche tipo di risposta ACK a una query. basta inviare una semplice query e attendere la risposta. Se non si ottiene, il dispositivo non c'è o almeno non rispondere.

Non ho provato, ma guardare il SerialPort.PinChanged evento e DsrChanged .

Ogni volta che c'è un qualsiasi dispositivo normale collegato alla porta seriale e acceso, quindi mi aspetto pin DSR del porto di affermare; e viceversa se il dispositivo è scollegato, o quando è spento, quindi mi aspetto lo stato perno DSR per modificare / drop.


Il significato usuale dei vari perni è:

  • DSR: dispositivo sia collegato e acceso
  • CTS: dispositivo è pronto a ricevere dati (questo può essere giù anche quando un dispositivo è collegato, ad esempio quando il dispositivo ha un buffer limitato di bordo e utilizza questo perno di regolazione di flusso dati di trasferimento dal PC)
  • DCD: periferica (modem) ha stabilito un collegamento sulla linea telefonica ad un altro modem (quindi tutto si invia è trattata come dati da trasferire al modem remoto)

Di queste, quella che risponde alla tua OP è DSR.

un modo per rilevare porta seriale estrazione / inserimento in .NET - vedi la mia risposta a Rileva serial inserimento porto / rimozione

    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

è possibile rilevare le porte seriali disponibili, la si può provare a comunicare con loro all'interno di un blocco try ... catch.

Questo è un esempio di rilevamento di porte in 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
}

Dipenderà da che tipo di dispositivo si connette con che tipo di cavo.

La cosa migliore è quello di provare la manipolazione del gestore di eventi PinChanged.

Alcuni dispositivi alzerà DSR una volta collegato e acceso, altri CTS, altri utilizzeranno questi per la sincronizzazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top