2010-05-14 44 views
24

Tôi có một số mã mà tải các cổng nối tiếp vào một combo-box:Bắt Serial Port Thông tin

 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; 

Tôi muốn thêm các mô tả cổng (tương tự như những gì được hiển thị cho các cổng COM trong Device Người quản lý) vào danh sách và sắp xếp các mục trong danh sách sau chỉ mục 0 (được giải quyết: xem đoạn mã trên). Có ai có bất cứ đề nghị để thêm các mô tả cổng? Tôi đang sử dụng Microsoft Visual C# 2008 Express Edition (.NET 2.0). Bất kỳ suy nghĩ nào bạn có thể sẽ được đánh giá cao. Cảm ơn.

+0

Hãy xem http://stackoverflow.com/questions/1378288/c-custom-combobox-sorting – volody

+0

Làm thế nào về việc lưu trữ kết quả của SerialPort.GetPortNames() trong một biến, phân loại nó và sau đó vòng lặp. –

Trả lời

13

Có một post about this same issue on MSDN:

Bắt thêm thông tin về một cổng nối tiếp trong C#

Hi Ravenb,

Chúng ta không thể lấy thông tin thông qua các loại SerialPort. Tôi không biết tại sao bạn cần thông tin này trong đơn đăng ký của mình. Tuy nhiên, có một số solved thread có cùng câu hỏi với bạn. Bạn có thể kiểm tra mã ở đó và xem nó có thể giúp bạn không.

Nếu bạn gặp thêm bất kỳ sự cố nào, vui lòng cho tôi biết.

Trân trọng, Bruce Zhou

Các liên kết trong bài mà đi với trang này:

Làm thế nào để nhận được thông tin thêm về cổng sử dụng System.IO.Ports.SerialPort

Bạn có thể nhận được thông tin này từ truy vấn WMI. Hãy xem this tool để giúp bạn tìm đúng mã. Tại sao bạn sẽ quan tâm? Đây chỉ là một chi tiết cho một bộ mô phỏng USB, các cổng nối tiếp bình thường sẽ không có điều này. Một cổng nối tiếp chỉ đơn giản là biết bởi "COMx", không có gì nhiều hơn nữa.

+0

Liên kết đến chuỗi đã giải quyết có mã tôi đã theo dõi. Một chút cũ nhưng nó hoạt động để có được số cổng COM từ PID & VID. Cảm ơn +1 – ppumkin

+14

Một số câu trả lời thiếu kinh nghiệm đau đớn trong những trích dẫn đó. Có rất nhiều lý do rõ ràng để muốn thông tin này. Nếu bạn đang có một người dùng chọn một cổng để sử dụng, bạn muốn hiển thị tên thiết bị (không phải năm 1995, vì vậy không thể cung cấp danh sách cổng COM) và nếu bạn đang làm việc với một thiết bị cụ thể đã biết, bạn có thể sử dụng thông tin thiết bị để tự động chọn đúng cổng. –

1

Tôi không hoàn toàn chắc chắn ý bạn là gì khi "phân loại các mục sau chỉ mục 0", nhưng nếu bạn chỉ muốn sắp xếp mảng chuỗi trả về SerialPort.GetPortNames(), bạn có thể sử dụng Array.Sort.

+0

Tôi đã thêm chi tiết vào câu hỏi ban đầu của mình. Cảm ơn. –

25

Sử dụng đoạn mã sau

nó mang lại cho sau đầu ra khi thực thi.

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

Đừng quên để thêm

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

Ngoài ra thêm tài liệu tham khảo để system.Management (theo mặc định nó không phải là có sẵn)

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 

Cập nhật: Bạn cũng có thể kiểm tra

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

thay vì

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

Tôi đã bao gồm một kiểm tra null kể từ khi vòng lặp của tôi đã được đánh giá 82 lần với 3 trận đấu. Phần còn lại trả về null. if ((queryObj ["Caption"]! = Null) && (queryObj ["Caption"]. ToString(). Chứa ("(COM"))) – Larry

31

EDIT: Xin lỗi, tôi nén qua câu hỏi của bạn quá nhanh. Bây giờ tôi nhận ra rằng bạn đang tìm kiếm một danh sách với tên cổng + mô tả cổng. Tôi đã cập nhật mã phù hợp ...

Sử dụng System.Management, bạn có thể truy vấn cho tất cả các cổng, và tất cả các thông tin cho mỗi cổng (giống như Device Manager ...)

Mẫu mã (hãy chắc chắn để thêm tài liệu tham khảo để System.Management):

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

Thông tin thêm ở đây: 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

Thay vì chỉ đăng một khối mã, vui lòng * giải thích * tại sao mã này giải quyết vấn đề đặt ra. Không có giải thích, đây không phải là câu trả lời. –

4

tôi đã cố gắng rất nhiều giải pháp trên đây mà không làm việc cho tôi, chỉ hiển thị một số cổng. Nhưng sau đây hiển thị Tất cả chúng và thông tin của chúng.

 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); 
      } 
     } 
    } 
Các vấn đề liên quan