2010-04-20 5 views
4

Il existe plusieurs façons de lister les ports série sous Windows, mais je ne suis pas sûr de la bonne façon de procéder: la façon de détecter tous les ports série disponibles.Quelle est la bonne façon de détecter tous les ports série disponibles sur Windows?

Un bon exemple de code est http://www.naughter.com/enumser.html - où il y a 9 (neuf!) Façons d'énumérer les périphériques série.

La question est: quelle est la façon optimale de le faire.

Exigences:

  • aux ports ouverts non afin de vérifier si elles sont disponibles.
  • pour pouvoir détecter des ports avec des noms différents de COMx.
  • pour travailler sous Windows XP SP2 ou au-dessus

Répondre

2

ports série sont des dispositifs très simples, datant de l'âge de pierre de matériel informatique. Ils ne prennent pas en charge Plug & Lecture, il n'y a aucun moyen de dire que quelqu'un a branché un périphérique. La seule chose que vous pouvez faire est de découvrir quels ports sont disponibles, le SerialPort.GetPortNames() retourne la liste. Certains émulateurs USB peuvent générer un nom descriptif pour aller avec le nom du port, vous pouvez découvrir ceux avec WMI, classe Win32_SerialPort.

Aucune ne vous aide à découvrir quel port COM est connecté à un périphérique particulier. Seul un humain sait, elle a physiquement branché le câble dans le connecteur. Vous devez fournir une interface utilisateur de configuration qui permet à l'utilisateur de sélectionner le numéro de port. Une zone de liste déroulante fait le travail. Enregistrer la sélection dans vos données de configuration, il est très probablement que le périphérique est toujours connecté au même port la prochaine fois que votre programme démarre.

+0

J'utilise SerialPort.GetPortNames(). – dbasnett

+4

Les ports série sont tellement sous-évalués! Parfois, je ne veux pas de ce malarky plug & play compliqué .. Je veux juste brancher un câble et tapez. Vive RS232! –

+0

@ LightnessRacesinOrbit Com ports sont bien jusqu'à ce que vous êtes dans la position où vous devez essayer de détecter quand on a été ajouté, alors ils sont l'enfer. – Pharap

2
void SelectComPort() //added function to find the present serial 
{ 

    TCHAR lpTargetPath[5000]; // buffer to store the path of the COMPORTS 
    DWORD test; 
    bool gotPort=0; // in case the port is not found 

    for(int i=0; i<255; i++) // checking ports from COM0 to COM255 
    { 
     CString str; 
     str.Format(_T("%d"),i); 
     CString ComName=CString("COM") + CString(str); // converting to COM0, COM1, COM2 

     test = QueryDosDevice(ComName, (LPSTR)lpTargetPath, 5000); 

      // Test the return value and error if any 
     if(test!=0) //QueryDosDevice returns zero if it didn't find an object 
     { 
      m_MyPort.AddString((CString)ComName); // add to the ComboBox 
      gotPort=1; // found port 
     } 

     if(::GetLastError()==ERROR_INSUFFICIENT_BUFFER) 
     { 
      lpTargetPath[10000]; // in case the buffer got filled, increase size of the buffer. 
      continue; 
     } 

    } 

    if(!gotPort) // if not port 
    m_MyPort.AddString((CString)"No Active Ports Found"); // to display error message incase no ports found 

} 
2

Si vous pouvez accéder au Registre, la HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM clé contient une liste des ports COM Windows prend en charge actuellement (dans certains cas, ces informations peuvent être périmées/incorrectes, comme, je pense, lorsqu'une fiche & dispositif de jeu fournir des ports série n'a pas terminé la détection/installation ou a été récemment supprimé).

C'est ainsi que la méthode SerialPort.GetPortNames() de .NET Framework signale les ports COM disponibles, et les informations ci-dessus sont dérivées de la page liée.

-1
CUIntArray ports; 
EnumerateSerialPorts(ports); 

for (int i = 0; i<ports.GetSize(); i++) 
{ 
    CString str; 
    str.Format(_T("COM%d"), ports.ElementAt(i)); 
    m_ctlPort.AddString(str); 
} 
+1

S'il vous plaît inclure * pourquoi * cela résout le problème. –

+0

Ou exactement quelle bibliothèque cette référence – Mikhail

Questions connexes