Question

Dans l'objet SerialPort de .Net, est-il un moyen de déterminer si un port série obtient débranché ou branché.

Était-ce utile?

La solution

Contrairement à USB, le port série n'a pas de façon intégrée pour détecter un changement physique dans l'état du lien. Une forme limitée de signalisation « appareil prêt / pas prêt » peut être fait en utilisant certaines des broches (à savoir DTR, DSR, et parfois DCD), mais cela ne semble pas exactement ce que vous cherchez (ce n'est pas construit en RS232 -. l'appareil doit prendre en charge, vous utilisez principalement pour parler aux modems)

Donc, en bref: non, dans le cas général. Si vous connaissez / peut programmer l'appareil que vous essayez de communiquer avec, et vous savez qu'il tiendra une certaine ligne haute (par exemple), vous pouvez interroger, il recherche de cette ligne pour aller haut. Mais si vous branchez un périphérique qui n'est pas programmé pour faire quelque chose prévisible comme ça, alors il n'y a vraiment aucun moyen de dire. (Certains appareils peuvent tenir haut DSR par défaut, mais il est en aucun cas un pari sûr.)

Autres conseils

La plupart des appareils de série ont un certain type de réponse ack à une requête. il suffit d'envoyer une requête simple et attendre la réponse. Si vous ne l'obtenez pas, l'appareil n'est pas là ou du moins ne répond pas.

Je n'ai pas essayé, mais regardez la SerialPort.PinChanged événement et DsrChanged .

Chaque fois qu'il ya un appareil normale branché au port série et allumé, alors je vous attends à la broche DSR du port à affirmer; et inversement, si cet appareil est débranché, ou quand il est éteint, alors je vous attendriez l'état de la broche DSR pour changer / drop.


Le sens habituel des différents axes est:

  • DSR: L'appareil est branché et allumé
  • CTS: L'appareil est prêt à recevoir des données (ce qui peut être en panne, même lorsqu'un appareil est branché, par exemple lorsque le dispositif a une mémoire tampon limitée embarqué et utilise cette broche pour contrôle de flux de transfert de données à partir du PC)
  • DCD: dispositif (modem) a établi une connexion sur la ligne téléphonique à un autre modem (donc tout ce que vous envoyez est traité comme des données à transférer au modem distant)

Parmi ceux-ci, celui qui répond à votre OP est DSR.

est un moyen de détecter le retrait / insertion Port série dans .NET - voir ma réponse à Détecter série insertion du port / suppression

    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

vous pouvez détecter les ports série disponibles, vous pouvez l'essayer de communiquer avec eux à l'intérieur d'un bloc try ... catch.

Ceci est un exemple de ports détection dans 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
}

Cela dépendra de quel type d'appareil que vous connectez avec ce type de câble.

Votre meilleur pari est d'essayer manipuler le gestionnaire d'événements PinChanged.

Certains périphériques soulèveront DSR lorsqu'ils sont connectés et sous tension, d'autres CTS, d'autres utiliseront ces derniers pour handshake.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top