Cavo seriale Unplugged Port
-
21-08-2019 - |
Domanda
Nel oggetto SerialPort di Net, c'è un modo per determinare se una porta seriale viene scollegato o collegato.
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.