2012-10-10 2 views
1

Comment puis-je découvrir, à l'aide de la classe SerialPort de C#, si un périphérique est connecté à un port série (COM) spécifique?Comment puis-je savoir si un périphérique est connecté à un port série (COM) spécifique?

Remarque: la méthode Open de cette classe ouvre le port même si aucun périphérique n'est connecté au port.

+0

La propriété DsrHolding est vraie lorsqu'un périphérique est connecté au port et mis sous tension. Bien sûr, vous n'aurez aucune idée de quel appareil particulier jusqu'à ce que vous commenciez à lui parler. –

+0

"La propriété DsrHolding sera vraie quand un périphérique est connecté" - peut ou non être, en fonction de l'appareil et du câble. – Joe

Répondre

1

La réponse dépend sur l'appareil et le câble.

Dans certains cas, DSR (SerialPort.DsrHolding) ou même CTS (SerialPort.CtsHolding) sera déclenché lorsque le périphérique est connecté. Mais dans certains cas, vous ne pouvez avoir qu'un Tx/Rx connecté, et la seule façon de le dire est de tenter de communiquer avec le périphérique.

Vous devez consulter la documentation de votre périphérique et de son câble.

Aucune solution générale ne fonctionne pour aucun périphérique.

0

Vous pouvez le faire en ouvrant le port série et en envoyant la commande la plus basique à votre appareil et en vérifiant la réponse. Par exemple pour le modem GSM, vous ouvrez le port et l'envoyez à la commande et recevez ok en réponse.

0

Couple de choses que vous pouvez essayer

  1. Créer série objet port et ouvrir un port, maintenant lorsqu'un périphérique est connecté , OS doit envoyer un événement CDChanged.
  2. Vous ping sur le port série, et si vous recevez une réponse en arrière, supposons qu'il est connecté.
+0

Etes-vous sûr que tout périphérique doit renvoyer une réponse? Laissez-moi vérifier cela. – Saran

+0

@Saran: Non, il n'est pas obligatoire pour tout le périphérique de retourner un message. –

3

1.WMI: SELECT * FROM Win32_SerialPort:

ManagementObjectSearcher manObjSearch = new ManagementObjectSearcher("Select * from Win32_SerialPort"); 
ManagementObjectCollection manObjReturn = manObjSearch.Get(); 

foreach (ManagementObject manObj in manObjReturn) 
{ 
    //int s = manObj.Properties.Count; 
    //foreach (PropertyData d in manObj.Properties) 
    //{ 
    // Console.WriteLine(d.Name); 
    //} 
    Console.WriteLine(manObj["DeviceID"].ToString()); 
    Console.WriteLine(manObj["Name"].ToString()); 
    Console.WriteLine(manObj["Caption"].ToString()); 
} 

2. Si la réponse périphérique Renvoyez: System.IO.Ports.SerialPort.GetPortNames() et l'envoi de la commande de base:

foreach (string portname in SerialPort.GetPortNames()) 
{ 
    var sp = new SerialPort(portname, 4800, Parity.Odd, 8, StopBits.One); 
    try 
    { 
     sp.Open(); 
     sp.Write("Your known command to device"); 
     Thread.Sleep(500); 
     string received = sp.ReadLine(); 

     if (received == "expected response") 
     { 
      Console.WriteLine("device connected to: " + portname); 
      break; 
     } 
    } 
    catch (Exception) 
    { 
     Console.WriteLine("device NOT connected to: " + portname); 
    } 
    finally 
    { 
     sp.Close(); 
    } 
} 
+0

Que faire si l'appareil est connecté et ne répondra pas. Par exemple, l'affichage de pôle connecté au port COM ne peut renvoyer aucune donnée. – Saran

+0

J'ai mis à jour ma réponse. – Ria

Questions connexes