2010-05-14 3 views
24

Ich habe einige Code, der die seriellen Schnittstellen in eine Combo-Box lädt:Erste Serial Port Informationen

 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 hinzufügen, die Port-Beschreibungen (ähnlich dem, was für die COM-Ports im Gerät angezeigt Manager) auf die Liste und sortieren Sie die Einträge in der Liste, die nach dem Index 0 sind (gelöst: siehe oben Snippet). Hat jemand Vorschläge zum Hinzufügen der Portbeschreibungen? Ich verwende Microsoft Visual C# 2008 Express Edition (.NET 2.0). Irgendwelche Gedanken, die Sie haben könnten, würden geschätzt werden. Vielen Dank.

+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/1378288/c-custom-combobox-sorting – volody

+0

Wie wäre das Ergebnis SerialPort.GetPortNames() in einer Variablen speichern, sie sortieren und dann Schleife. –

Antwort

13

Es gibt eine post about this same issue on MSDN:

Erste Weitere Informationen über eine serielle Schnittstelle in C#

Hallo Ravenb,

Wir nicht die Informationen über die Serialport-Typ erhalten. Ich weiß nicht, warum Sie diese Informationen in Ihrer Bewerbung benötigen. Allerdings gibt es eine solved thread mit der gleichen Frage wie Sie. Sie können den Code dort überprüfen und sehen, ob es Ihnen helfen kann.

Wenn Sie ein weiteres Problem haben, zögern Sie nicht mich zu informieren.

Mit freundlichen Grüßen, Bruce Zhou

Der Link in diesem Beitrag geht an diese:

Wie weitere Informationen über Port bekommen mit System.IO.Ports.SerialPort

Sie können diese Informationen wahrscheinlich von einer WMI-Abfrage erhalten. Schauen Sie sich this tool an, damit Sie den richtigen Code finden. Warum würde es dich interessieren? Dies ist nur ein Detail für einen USB-Emulator, normale serielle Ports haben dies nicht. Eine serielle Schnittstelle ist einfach per "COMx" bekannt, mehr nicht.

+0

Der Link zum gelösten Thread hatte den Code, nach dem ich suchte. Ein bisschen alt, aber es funktioniert, um die COM-Port-Nummer von PID & VID zu bekommen. Danke +1 – ppumkin

+14

Einige schmerzlich unerfahrene Antworten in diesen Zitaten. Es gibt viele offensichtliche Gründe, diese Information zu wollen. Wenn ein Benutzer einen zu verwendenden Port auswählt, möchten Sie den Gerätenamen anzeigen (es ist nicht 1995, daher ist es nicht OK, nur eine Liste von COM-Ports anzugeben), und wenn Sie mit einem bestimmten bekannten Gerät arbeiten, Sie können Geräteinformationen verwenden, um automatisch den richtigen Port auszuwählen. –

1

Ich bin nicht ganz sicher, was Sie mit "Sortierung der Elemente nach Index 0" meinen, aber wenn Sie nur das Array von Zeichenfolgen SerialPort.GetPortNames() zurückgegeben werden möchten, können Sie Array.Sort verwenden.

+0

Ich habe Details zu meiner ursprünglichen Frage hinzugefügt. Vielen Dank. –

25

Verwenden Sie folgenden Code-Snippet

gibt es Ausgang folgenden wenn sie ausgeführt werden.

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

Vergessen Sie nicht,

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

Fügen Sie auch Bezug auf system.Management (standardmäßig ist es 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 hinzufügen

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 auch für

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

statt

if (queryObj["Caption"].ToString().Contains("(COM")) 
+3

Ich musste einen Null-Check einbeziehen, da meine Schleife 82 Mal mit 3 Übereinstimmungen ausgewertet wurde. Der Rest hat null zurückgegeben. if ((queryObj ["Caption"]! = Null) && (queryObj ["Caption"]. ToString(). Enthält ("(COM"))) – Larry

31

EDIT überprüfen können: Sorry, gezippt ich Ihre Frage zu schnell vorbei. Mir ist jetzt klar, dass Sie nach einer Liste mit dem Portnamen + Portbeschreibung suchen. Ich habe den Code entsprechend aktualisiert ...

System.Management verwenden, können Sie für alle Ports abgefragt werden, und alle Informationen für jeden Port (wie Geräte-Manager ...)

Beispielcode (stellen Sie sicher, Hinweis auf System.Management hinzugefügt werden):

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(); 
     } 
    } 
} 

Mehr Infos hier: http://msdn.microsoft.com/en-us/library/aa394582%28VS.85%29.aspx

0
this.comboPortName.Items.AddRange(
    (from qP in System.IO.Ports.SerialPort.GetPortNames() 
    orderby System.Text.RegularExpressions.Regex.Replace(qP, "~\\d", 
    string.Empty).PadLeft(6, '0') 
    select qP).ToArray() 
); 
+6

Anstatt nur einen Codeblock zu posten, bitte * erklären * Warum löst dieser Code das gestellte Problem, ohne eine Erklärung ist dies keine Antwort. –

4

ich habe versucht, so viele Lösungen hier, die nicht für mich arbeiten, nur einige der Ports angezeigt. Aber das Folgende zeigte alle von ihnen und ihre Informationen.

 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); 
      } 
     } 
    }