webentwicklung-frage-antwort-db.com.de

Informationen zum seriellen Anschluss abrufen

Ich habe einen Code, der die seriellen Ports in eine Combo-Box lädt:

     List<String> tList = new List<String>(); 

     comboBoxComPort.Items.Clear();

     foreach (string s in SerialPort.GetPortNames())
     {
        tList.Add(s);
     }

     tList.Sort();
     comboBoxComPort.Items.Add("Select COM port...");
     comboBoxComPort.Items.AddRange(tList.ToArray());
     comboBoxComPort.SelectedIndex = 0;

Ich möchte die Portbeschreibungen (ähnlich wie die für die COM-Ports im Geräte-Manager angezeigten) zur Liste hinzufügen und sortieren Sie die Elemente in der Liste, die nach dem Index 0 stehen (gelöst: siehe oben Schnipsel). Hat jemand Vorschläge zum Hinzufügen der Portbeschreibungen? Ich verwende Microsoft Visual C # 2008 Express Edition (.NET 2.0). Alle mögliche Gedanken, die Sie haben können, würden geschätzt. Vielen Dank.

31
Jim Fell

Es gibt ein Post über das gleiche Problem auf MSDN :

Weitere Informationen zu einer seriellen Schnittstelle in C # abrufen

Hallo Ravenb,

Wir können die Informationen nicht über den SerialPort-Typ abrufen. Ich weiß nicht, warum Sie diese Informationen in Ihrer Bewerbung benötigen. Es gibt jedoch ein gelöstes Thema mit der gleichen Frage wie Sie. Sie können den Code dort überprüfen und sehen, ob er Ihnen helfen kann.

Wenn Sie weitere Probleme haben, wenden Sie sich bitte an mich.

Viele Grüße, Bruce Zhou

Der Link in diesem Beitrag geht zu diesem:

So erhalten Sie weitere Informationen zum Port mithilfe von System.IO.Ports.SerialPort

Sie können diese Informationen wahrscheinlich aus einer WMI-Abfrage abrufen. Schauen Sie sich dieses Tool an, um den richtigen Code zu finden. Warum sollte es dich interessieren? Dies ist nur ein Detail für einen USB-Emulator, normale serielle Ports haben dies nicht. Eine serielle Schnittstelle kennt einfach "COMx", mehr nicht.

16

BEARBEITEN: Entschuldigung, ich habe Ihre Frage zu schnell beantwortet. Mir ist jetzt klar, dass Sie nach einer Liste mit dem Portnamen und der Portbeschreibung suchen. Ich habe den Code entsprechend aktualisiert ...

Mit System.Management können Sie alle Ports und alle Informationen für jeden Port abfragen (genau wie im Geräte-Manager ...).

Beispielcode (stellen Sie sicher, dass Sie einen Verweis auf System.Management hinzufügen):

using System;
using System.Management;
using System.Collections.Generic;
using System.Linq;
using System.IO.Ports;        

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var searcher = new ManagementObjectSearcher
                ("SELECT * FROM WIN32_SerialPort"))
            {
                string[] portnames = SerialPort.GetPortNames();
                var ports = searcher.Get().Cast<ManagementBaseObject>().ToList();
                var tList = (from n in portnames
                            join p in ports on n equals p["DeviceID"].ToString()
                            select n + " - " + p["Caption"]).ToList();

                tList.ForEach(Console.WriteLine);
            }

            // pause program execution to review results...
            Console.WriteLine("Press enter to exit");
            Console.ReadLine();
        }
    }
}

Weitere Informationen finden Sie hier: http://msdn.Microsoft.com/en-us/library/aa394582%28VS.85%29.aspx

40
code4life

Verwenden Sie das folgende Code-Snippet

Es gibt folgende Ausgabe aus, wenn es ausgeführt wird.

serial port : Communications Port (COM1)
serial port : Communications Port (COM2)

Vergiss nicht hinzuzufügen

using System;
using System.Management;
using System.Windows.Forms;

Verweis auch auf system.Management (standardmäßig nicht verfügbar)

C #

private void GetSerialPort()
{

    try
    {
        ManagementObjectSearcher searcher = 
            new ManagementObjectSearcher("root\\CIMV2", 
            "SELECT * FROM Win32_PnPEntity"); 

        foreach (ManagementObject queryObj in searcher.Get())
        {
            if (queryObj["Caption"].ToString().Contains("(COM"))
            {
                Console.WriteLine("serial port : {0}", queryObj["Caption"]);
            }

        }
    }
    catch (ManagementException e)
    {
        MessageBox.Show( e.Message);
    }

}

VB

  Private Sub GetAllSerialPortsName()
        Try
            Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_PnPEntity")
            For Each queryObj As ManagementObject In searcher.Get()
                If InStr(queryObj("Caption"), "(COM") > 0 Then
                    Console.WriteLine("serial port : {0}", queryObj("Caption"))
                End If
            Next
        Catch err As ManagementException
            MsgBox(err.Message)
        End Try
    End Sub

Update: Sie können auch nachsehen

if (queryObj["Caption"].ToString().StartsWith("serial port"))

anstatt von

if (queryObj["Caption"].ToString().Contains("(COM"))
29
Sachin Chavan

Ich habe hier so viele Lösungen ausprobiert, die für mich nicht funktionierten und nur einige der Ports anzeigten. Im Folgenden werden jedoch alle und ihre Informationen angezeigt.

        using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Caption like '%(COM%'"))
        {
            var portnames = SerialPort.GetPortNames();
            var ports = searcher.Get().Cast<ManagementBaseObject>().ToList().Select(p => p["Caption"].ToString());

            var portList = portnames.Select(n => n + " - " + ports.FirstOrDefault(s => s.Contains(n))).ToList();

            foreach(string s in portList)
            {
                Console.WriteLine(s);
            }
        }
    }
16
humudu

Ich bin mir nicht ganz sicher, was Sie unter "Sortieren der Elemente nach Index 0" verstehen. Wenn Sie jedoch nur das von SerialPort.GetPortNames() zurückgegebene Array von Zeichenfolgen sortieren möchten, können Sie Array.Sort) verwenden .

2
Heinzi