Comment trouver les ports COM disponibles?

Comment trouver les ports COM disponibles sur mon PC? J’utilise framework v1.1. Est-il possible de trouver tous les ports COM? Si possible, aidez-moi à résoudre le problème.

Comme d’autres l’ont suggéré, vous pouvez utiliser WMI. Vous pouvez trouver un exemple dans CodeProject

try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSSerial_PortName"); foreach (ManagementObject queryObj in searcher.Get()) { Console.WriteLine("-----------------------------------"); Console.WriteLine("MSSerial_PortName instance"); Console.WriteLine("-----------------------------------"); Console.WriteLine("InstanceName: {0}", queryObj["InstanceName"]); Console.WriteLine("-----------------------------------"); Console.WriteLine("MSSerial_PortName instance"); Console.WriteLine("-----------------------------------"); Console.WriteLine("PortName: {0}", queryObj["PortName"]); //If the serial port's instance name contains USB //it must be a USB to serial device if (queryObj["InstanceName"].ToSsortingng().Contains("USB")) { Console.WriteLine(queryObj["PortName"] + " is a USB to SERIAL adapter/converter"); } } } catch (ManagementException e) { Console.WriteLine("An error occurred while querying for WMI data: " + e.Message); } 

AFIIK Framework v1.1 ne vous permet pas de faire cela.

En 2.0 il y a une fonction statique

 SerialPort.GetPortNames() 

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.getportnames.aspx

Les ports série disponibles peuvent également être trouvés aux valeurs de la HKEY_LOCAL_MACHINE\hardware\devicemap\serialcomm dans le registre.

Pourquoi ne pas poser une question directe au système d’exploitation:

 using System; using System.Collections.Generic; using Microsoft.Win32; using System.Runtime.InteropServices; using Microsoft.Win32.SafeHandles; public class MyClass { private const uint GENERIC_ALL = 0x10000000; private const uint GENERIC_READ = 0x80000000; private const uint GENERIC_WRITE = 0x40000000; private const uint GENERIC_EXECUTE = 0x20000000; private const int OPEN_EXISTING = 3; public const int INVALID_HANDLE_VALUE = -1; public static void Main() { for (int i = 1; i <= 32; i++) Console.WriteLine ("Port {0}: {1}", i, PortExists (i)); } private static bool PortExists (int number) { SafeFileHandle h = CreateFile (@"\\.\COM" + number.ToString (), GENERIC_READ + GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero); bool portExists = !h.IsInvalid; if (portExists) h.Close (); return portExists; } [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] private static extern SafeFileHandle CreateFile (string lpFileName, System.UInt32 dwDesiredAccess, System.UInt32 dwShareMode, IntPtr pSecurityAttributes, System.UInt32 dwCreationDisposition, System.UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile); } 

WMI contient beaucoup d’informations sur le matériel. Requête pour les instances de Win32_SerialPort .

(OTOH, je ne me souviens plus de la quantité de prise en charge des requêtes WMI dans .NET 1.1.)

La communication SerialPort n’est pas prise en charge dans .net v1.1. La solution la plus courante consistait à utiliser le contrôle X actif MSCOMMCTL à partir d’une installation VB6.0 (importation dans votre projet .net en tant que composant COM à partir de la boîte de dialog Ajouter une référence).

Dans les versions ultérieures, la prise en charge du port série est disponible via l’espace de noms System.IO.Ports. Notez également qu’il n’y a pas d’API qui vous donnera la liste des ports libres.

Vous pouvez obtenir une liste de tous les noms de ports, puis essayer d’ouvrir une connexion. Une exception se produit si le port est déjà utilisé.

Puisque vous utilisez .net 1.1, une option consiste à utiliser le contrôle AxMSCommLib.

Voici une page Web qui m’a aidé à commencer à utiliser le contrôle AxMSCommLib. Il existe même une méthode FindDevicePort () répertoriée qui peut être facilement modifiée.

Depuis, je suis passé à System.IO.Ports, qui semble beaucoup plus robuste.

http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=320

Merci

Joe

Peut-être trouverez-vous cela utile?

Je vous montre un moyen simple de vérifier tous les ports COM de votre PC. Pour commencer, suivez ces étapes:

  1. Créez une application WinForms dans Visual Studio.
  2. Darg et déposer une comboBox dans votre formulaire et nommez-le comboBoxCOMPORT
  3. Copiez le code suivant et collez-le après la méthode publique Form1 () (générée automatiquement).

     private void Form1_Load(object sender, EventArgs e) { ssortingng[] ports = SerialPort.GetPortNames(); comboBoxCOMPORT.Items.AddRange(ports); } 
  4. Exécutez l’application et cliquez sur la flèche de la liste déroulante pour afficher tous les ports COM disponibles.

La méthode ci-dessus fonctionne pour les convertisseurs Edgeport USB vers série ainsi que pour les ports virtuels. Je l’ai implémenté dans mon projet et fonctionne bien. Faites-moi savoir si je peux fournir une assistance supplémentaire.

Utilisez la fonction API QueryDosDevice . Ceci est un extrait VB6:

  ReDim vRet(0 To 255) sBuffer = Ssortingng(100000, 1) Call QueryDosDevice(0, sBuffer, Len(sBuffer)) sBuffer = Chr$(0) & sBuffer For lIdx = 1 To 255 If InStr(1, sBuffer, Chr$(0) & "COM" & lIdx & Chr$(0), vbTextCompare) > 0 Then vRet(lCount) = "COM" & lIdx lCount = lCount + 1 End If Next