У меня есть некоторый код, я написал для поиска 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) вопрос ломает мой код, если я использую его, и пусть, если разорвать петлю, может кто-нибудь объяснить, почему, и что я мог сделать? (код работает отлично до сих пор, но не в состоянии разорвать петлю замедляет его совсем немного)
Заранее спасибо :)
С уважением, киноварь
спасибо, я попробую это и сообщит о себе :) – Cinnabar
добро пожаловать, надеюсь, что он решает вашу проблему. – Alexus