Pergunta

objeto SerialPort do Na Net, há uma maneira de determinar se uma porta serial fica desligado ou ligado.

Foi útil?

Solução

Ao contrário do USB, a porta serial não tem qualquer built-in maneira de detectar uma mudança física no estado link. Uma forma limitada de "dispositivo pronto / não pronto" sinalização pode ser feito usando alguns dos pinos (ou seja, DTR, DSR, e às vezes DCD), mas isso não parece ser exatamente o que você está procurando (não é construído em para RS232 -. o dispositivo deve apoiá-lo, você usá-lo principalmente para falar com modems)

Então, em suma: não, no caso geral. Se você sabe / pode programar o dispositivo que você está tentando se comunicar com, e você sabe que ele irá realizar uma determinada linha de alta (por exemplo), você pode consultar-lo olhando para essa linha para ir alta. Mas se você conectar um dispositivo que não está programado para fazer algo previsível assim, então não há realmente nenhuma maneira de dizer. (Alguns dispositivos podem realizar DSR alta por padrão, mas é de nenhuma maneira uma aposta certa.)

Outras dicas

A maioria dos dispositivos seriais têm algum tipo de ack resposta a uma consulta. basta enviar uma consulta simples e aguarde a resposta. Se você não fizer isso, o dispositivo não está lá ou pelo menos não responder.

Eu não tentei, mas olhar para o SerialPort.PinChanged evento e DsrChanged .

Sempre que há qualquer dispositivo normal, conectado à porta serial e ligado, então eu esperaria pino DSR da porta a ser afirmado; e, inversamente, se esse dispositivo está desligado, ou quando ele está desligado, então eu esperaria o estado DSR PIN para alterar / queda.


O significado usual dos vários pinos é:

  • DSR: dispositivo está conectado e ligado
  • CTS: dispositivo está pronto para receber dados (pode ser para baixo, mesmo quando um dispositivo está ligado, por exemplo quando o dispositivo tem um buffer on-board limitada e usa este pino de controle de fluxo de transferência de dados a partir do PC)
  • DCD: dispositivo (modem) estabeleceu uma conexão através da linha telefônica para outro modem (então qualquer coisa que você envia é tratada como dados a serem transferidos para o modem remoto)

Destes, aquele que responde a sua OP é DSR.

Não é uma maneira de detectar Serial Port remoção / inserção no .NET - ver a minha resposta em Detectar porta serial de inserção / remoção

    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

Você pode detectar as portas seriais disponíveis, o que você pode tentar se comunicar com eles dentro de um bloco try ... catch.

Este é um exemplo de detecção de portas em 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
}

Vai depender de que tipo de dispositivo que você conectar-se com o tipo de cabo.

Sua melhor aposta é tentar lidar com o manipulador de eventos PinChanged.

Alguns dispositivos elevará DSR quando conectado e ligado, outros CTS, os outros vão usá-los para o aperto de mão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top