2015-10-28 16 views
2
SerialPort.GetPortNames(); 

возвращает следующий массив:SerialPort.GetPortNames возвращает тот же порт несколько раз

{ "COM1", "COM5", "COM5", "COM5", "COM5", "COM5", "COM5" } 

Он обычно имеет только каждое имя один раз. Работать вокруг это очень легко, но кто-нибудь знает, почему это когда-нибудь будет?

+1

Этот метод извлекает имена из реестра. Возможно, это неверные данные. [GetPortNames] (https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.getportnames (v = vs.110) .aspx) – endofzero

+1

Спасибо за редактирование @MethodMan –

ответ

2

Без дополнительной информации о вашей конкретной среде, включая конфигурацию машины и информацию о реестре, невозможно точно ответить. Но, скорее всего, (неудовлетворительный) ответ заключается в том, что GetPortNames() просто делает все возможное, имея доступную ему информацию.

I.e. он проверяет реестр, чтобы увидеть, какие порты существуют, и возвращает их список. В некоторых случаях один и тот же номер COM-порта может быть повторно использован несколькими устройствами или даже несколькими способами использования одного и того же устройства (в зависимости от драйвера), в результате чего номер порта будет указан в реестре более одного раза.

Действительно, в некоторых случаях вы можете вернуть имя COM-порта, которое на данный момент недействительно. То есть некоторое устройство, которое действительно существовало в какой-то момент, но которое было удалено/отключено/и т. д. и больше не используется.

Это классический вопрос «вывоз, вывоз мусора».

Для соответствующей информации по этому вопросу, вы хотели бы проверить эти переполнение стека вопросы:

GetPortNames() returns stale data/Remove stale comport entries in Windows?
SerialPort.GetPortNames() is wrong
SerialPort.GetPortNames() behavior

+0

Не знаете, почему это было отклонено. Хороший тщательный ответ и +1 для мусора в мусоре. –

+1

Я думаю, что это многократное использование одного и того же устройства. Это происходит редко, и обходным путем является создание списка уникальных имен строк из названных имен. Я разбираюсь с каждым устройством, чтобы определить, на какой COM он включен, поэтому это не блокирует меня, я просто подумал, что это странно. Я не понимаю, почему Microsoft запустила это из реестра, а не какие-то «живые» данные в ОС. Весь API Serial Port имеет странные моджо за мои деньги. –