2009-06-29 9 views

Répondre

14

Contrairement à l'USB, le port série n'a aucun moyen intégré de détecter un changement physique dans l'état de la liaison. Une forme limitée de signalisation «périphérique prêt/non prêt» peut être faite en utilisant certaines des broches (à savoir DTR, DSR, et parfois DCD), mais cela ne semble pas exactement ce que vous cherchez (il n'est pas intégré dans à RS232 - l'appareil doit le supporter, vous l'utilisez principalement pour parler aux modems.)

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

0

vous permet de détecter les disponibles ports série, le vous pouvez essayer de comuniquer avec eux à l'intérieur un essai ... attrape le bloc.

Voici un exemple de ports détection 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

Je crois que cette forme de .Connect() dans une boucle de liaison au port pour chaque connexion est maladroit, surtout si je veux un bel événement conduit SerialPortDisconnected événement. – maxfridbe

+0

'string [] sPorts = SerialPort.GetPortNames();' ne fonctionne pas car lorsque le port est connecté ex: 'COM1' et qu'il est déconnecté' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '1 '... – MrHIDEn

1

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

Chaque fois qu'un périphérique normal est branché sur le port série et allumé, la broche DSR du port doit être activée; et inversement si cet appareil est débranché, ou quand il est éteint, alors je m'attendrais à ce que l'état de la broche DSR change/baisse.


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 (cela peut être bas, même lorsqu'un l'appareil est branché, par exemple lorsque l'appareil dispose d'un tampon embarqué limité et utilise cette broche pour transférer les données de contrôle de flux à partir du PC)
  • DCD: l'appareil (modem) a établi une connexion via la ligne téléphonique vers un autre modem (tout ce que vous envoyez est traité comme des données à transférer t o le modem distant)

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

+1

Vrai si votre périphérique utilise l'établissement de liaison matérielle. De nombreux appareils ne le font pas. En fait, certains ports série n'ont même pas ces broches connectées. –

0

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

Votre meilleur pari est d'essayer de gérer le gestionnaire d'événements PinChanged.

Certains appareils augmenteront DSR lorsqu'ils sont connectés et allumés, d'autres CTS, d'autres les utiliseront pour l'établissement de liaison.

2

La plupart des périphériques série ont un type de réponse ack à une requête. envoyez simplement une requête simple et attendez la réponse. Si vous ne l'obtenez pas, le périphérique n'est pas là ou au moins ne répond pas.

1

Il est un moyen de détecter la suppression/insertion de port série dans.NET - voir ma réponse à Detect serial port insertion/removal

+0

L'auteur voulait probablement détecter si un * périphérique * est connecté au port série, et non si le port série est installé sur le système. – Zmaster

+0

@Zmaster - vous avez tellement raison! Je suppose que je ne pensais pas de cette façon. J'ai supprimé mon commentaire, mais je vais laisser la réponse ici au cas où quelqu'un cherche la situation à laquelle ma réponse s'applique. – 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 
Questions connexes