2009-06-29 21 views

risposta

14

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

Così, in breve: no, nel caso generale.. Se sai/puoi programmare il dispositivo con cui stai cercando di comunicare, e sai che manterrà una certa linea alta (per esempio), potresti eseguire il polling cercando quella linea per andare in alto. Ma se si collega un dispositivo che non è programmato per fare qualcosa di prevedibile come quello, allora non c'è davvero modo di dirlo. (Alcuni dispositivi possono detenere DSR alto di default, ma è in nessun modo una scommessa sicura.)

0

è possibile rilevare il disponibili porte seriali, la si può provare a comunicare con loro interno una prova ... cattura blocco.

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 
} 
+1

Credo che questa forma di .Connect() in un ciclo di legame alla porta per ogni connessione è goffo, specialmente se voglio un bel event driven SerialPortDisconnected evento. – maxfridbe

+0

'string [] sPorts = SerialPort.GetPortNames();' non funziona perché quando la porta è connessa ex: 'COM1' e poi scollegata' GetPortNames' riporta ancora 'COM1' esiste ... L'ho appena testato. – MrHIDEn

1

non l'ho provato, ma all'evento SerialPort.PinChanged 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 quel dispositivo è scollegato, o quando è spento, allora mi aspetto che lo stato del pin DSR cambi o scenda.


Il significato usuale dei vari perni è:

  • DSR: dispositivo è collegato e acceso
  • CTS: dispositivo è pronto a ricevere dati (questo può essere premuto 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 ciò che si invia viene considerato come dati da trasferire t o il modem remoto)

Di questi, quello che risponde al tuo OP è DSR.

+1

Vero se il dispositivo utilizza l'handshake hardware. Molti dispositivi no. In effetti alcune porte seriali non hanno nemmeno quei pin collegati. –

0

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

La soluzione migliore è provare a gestire il gestore di eventi PinChanged.

Alcuni dispositivi sollevare DSR se collegato e acceso, altri CTS, altri utilizzeranno questi per handshaking.

2

La maggior parte dei dispositivi seriali presenta un tipo di risposta ack a una query. invia semplicemente una query e attendi la risposta. Se non si ottiene, il dispositivo non è lì o almeno non risponde.

1

è un modo per rilevare rimozione/inserimento porta seriale in.NET - vedere la mia risposta a Detect serial port insertion/removal

+0

Probabilmente il poster voleva rilevare se un * dispositivo * è collegato alla porta seriale, non se la porta seriale è installata nel sistema. – Zmaster

+0

@Zmaster - hai ragione! Immagino che non stavo pensando in quel modo. Ho cancellato il mio commento, ma lascerò la risposta qui nel caso in cui qualcuno stia cercando la situazione a cui la mia risposta si applica. – 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 
Problemi correlati