2017-01-17 12 views
1

У меня есть некоторый код, я написал для поиска COM-порта определенного Мотора-контроллер, основан от этой статьи: Getting Serial Port InformationUSBDeviceInfo/ManagementObjectSearcher дает аргументы, которые where'nt просили

С этим кодом doesn' t явным образом ищу ComPorts, но для имен устройств и информации, я немного поиграл и узнал, что, когда вы ищете определенное устройство в результирующем списке, на которое ссылается имя, и записываете его в файл * .txt, COMPOT появляется (скобки) после имени, например: Devicename (COM5).

Это я использовал для записи этой информации в строку с использованием Array.Find, и с этого момента она просто выбирает номер для подключения.

Моя проблема в том, что я не хочу проходить через ВСЕ устройства, но только до тех пор, пока не найдет тот, который я ищу, а затем сломаю цикл.

Это, однако, приводит к строке [1] Array без COMPORT, прикрепленной к элементам, в отличие от строки [2] Массив с ComPort приложен, если я не нарушаю цикл.

Я хочу знать, почему COMPORT прилагается в первую очередь (моя догадка - коллекция.Dispose), и почему нарушение цикла убивает эту функцию/ошибку/независимо.

{ 

    public static void ComPortSelectionMain(/*string[] args*/) 
    { 
     string ComDummy; // ComPort, ComPortString; 
     int ComNumber = 0; 
     var usbDevices = GetUSBDevices(); 
     var ComList = new List<string>(); 


     foreach (var usbDevice in usbDevices) 
     { 
      if (usbDevice.Description == "PI C-863") 
      { 
       //Console.WriteLine("Device ID: {0}, PNP Device ID: {1}, Description: {2}", usbDevice.DeviceID, usbDevice.PnpDeviceID, usbDevice.Description); 
       ComList.Add(usbDevice.Name);  //Add USB Device 
      } 
     } 

     var ComArray = ComList.ToArray(); 
     var target = "PI C-863 (COM"; 
     // var target2 = ")"; 
     int arrayindex = 0; 
     int start = 0, stop = 0; 
     string targetname = "PI C-863"; 

     string test = (Array.Find(ComArray, element => element.Contains(targetname))); 
     //Console.WriteLine("Test: " + test); 
     if (test == targetname)    //look if comarray contains target 
     { 
      //int index = Array.FindIndex(ComArray, item => item == "(");   // row.Contains(targetname)); 
      int indexsigned = Array.IndexOf(ComArray, target); 
      int index = Math.Abs(indexsigned); 
      start = ComArray[index].IndexOf('(') + 1; 
      arrayindex = index; 
      stop = ComArray[index].IndexOf(')'); 
     } 

     int COMlength = 0, portlength = 0, pos = 0; 
     COMlength = stop - start; 
     portlength = stop - start - 3; 
     pos = start + 3; 
     //Console.WriteLine("COM: {0}", ComArray[arrayindex]); 
     ComDummy = ComArray[arrayindex].Substring(start, COMlength); 
     //Console.WriteLine("ComDummy: {0}", ComDummy); 
     ComNumber = Convert.ToInt32(ComArray[arrayindex].Substring(pos, portlength)); 
     Console.WriteLine("ComPort Number: {0}", ComNumber); 

     Console.Read(); 
    } 

    static List<USBDeviceInfo> GetUSBDevices() 
    { 
     List<USBDeviceInfo> devices = new List<USBDeviceInfo>(); 

     ManagementObjectCollection collection; 
     using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_PnPEntity")) 
      collection = searcher.Get(); 

     bool kappa = true; 
     foreach (var device in collection) 
     { 
      devices.Add(new USBDeviceInfo(
      (string)device.GetPropertyValue("DeviceID"), 
      (string)device.GetPropertyValue("PNPDeviceID"), 
      (string)device.GetPropertyValue("Description"), 
      (string)device.GetPropertyValue("Name"), 
      (string)device.GetPropertyValue("Service") 
      )); 

      ***//if ((devices.Exists(element => element.Description == "PI C-863")) && kappa) 
      //{ 
      // Console.WriteLine("Found PI C-863!"); 
      // kappa = false; 
      // //break; 
      //}*** <<< THIS IF() BREAKS MY CODE 
     } 

     collection.Dispose(); 
     return devices; 
    } 
} 

class USBDeviceInfo 
{ 
    public USBDeviceInfo(string deviceID, string pnpDeviceID, string description, string name, string var) 
    { 
     this.DeviceID = deviceID; 
     this.PnpDeviceID = pnpDeviceID; 
     this.Description = description; 
     this.Name = name; 
     this.Var = var; 
    } 
    public string DeviceID { get; private set; } 
    public string PnpDeviceID { get; private set; } 
    public string Description { get; private set; } 
    public string Name { get; private set; } 
    public string Var { get; private set; } 
} 

Условный (devices.Exist) вопрос ломает мой код, если я использую его, и пусть, если разорвать петлю, может кто-нибудь объяснить, почему, и что я мог сделать? (код работает отлично до сих пор, но не в состоянии разорвать петлю замедляет его совсем немного)

Заранее спасибо :)

С уважением, киноварь

ответ

0

Вы должны попробовать:

static List<USBDeviceInfo> GetUSBDevices() 
{ 
    ManagementObjectCollection collection; 
    using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_PnPEntity")) 
     collection = searcher.Get(); 

    foreach (var device in collection) 
    { 
     if(device.GetPropertyValue("Description").Equals("PI C-863")) 
     { 
      Console.WriteLine("Found PI C-863!"); 
      break; 
     } 

    } 

    collection.Dispose(); 
    return devices; 
} 

Я не тестировал его, но я думаю, что итерация над списком при добавлении в него может быть проблемой.

+0

спасибо, я попробую это и сообщит о себе :) – Cinnabar

+0

добро пожаловать, надеюсь, что он решает вашу проблему. – Alexus