Member 14563206 Ответов: 1

На моем HP pavilion я не могу получить .serialportnames


Ниже приведены различные способы, которые я пробовал.

Короче говоря, список имен, генерируемых в каждом из них, всегда равен 0.

Я использую ноутбук HP Pavilion dv6 и действительно понятия не имею, сколько портов я должен иметь доступ, но наверняка это больше, чем 1.

Заранее благодарю вас,

Сильвия

Что я уже пробовал:

Option Strict On

Imports System
Imports System.Data
Imports System.IO
Imports System.IO.Ports
Imports System.Threading
Imports System.Timers
Imports System.Data.OleDb
Imports System.ComponentModel
Imports System.Collections.ObjectModel
Imports System.Configuration
Imports System.Windows.Forms


Dim myPort As Array 'Array to hold the COM detected

		myPort = IO.Ports.SerialPort.GetPortNames() 'Get the portnames for the IO.Ports.SerialPort 

		'Loading COM into combobox
		CmbAry(0).Items.Add(myPort)         'ComboBox9.Items.AddRange(myPort)


		For Each portName As String In My.Computer.Ports.SerialPortNames
			CmbAry(0).Items.Add(portName)
		Next


		For i As Integer = 0 To My.Computer.Ports.SerialPortNames.Count - 1
			CmbAry(0).Items.Add(My.Computer.Ports.SerialPortNames(i))
		Next


Dim ports As System.Collections.ObjectModel.ReadOnlyCollection(Of String) = My.Computer.Ports.SerialPortNames
		i = ports.Count
		i = i
		For Each port As String In ports
			CmbAry(0).Items.Add(port)  'Console.WriteLine(port)
		Next

		For i = 0 To 3
			For Each sp As String In My.Computer.Ports.SerialPortNames
				CmbAry(i).Items.Add(sp)
			Next
		Next

1 Ответов

Рейтинг:
12

Maciej Los

Посмотрите на это: Как показать доступные последовательные порты в Visual Basic | Microsoft Docs[^]

Dim ports As List(Of String) = My.Computer.Ports.SerialPortNames.Select(Function(sp) sp).ToList()


важное Примечание:
Имена портов берутся из системного реестра (например, HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM). Если реестр содержит устаревшие или иным образом неверные данные, то метод GetPortNames вернет неверные данные.

Источник: Последовательный порт.Методом GetPortNames (Системы.ИО.Порта) | Майкрософт Документы[^]

Чтобы решить вашу проблему, вы должны использовать WMI Code Creator v1.0[^] и поиск имен портов с помощью запроса WMI. Смотрите второе решение этой темы: c# - получение информации о последовательном порте - переполнение стека[^]


[РЕДАКТИРОВАТЬ]
Взгляните на пример:
Sub Main
	
	Dim ports As List(Of SerialPortInfo) = Nothing
	DIm qry As String = "SELECT * FROM Win32_PnPEntity WHERE Caption like '%COM%'"
	'qry = "SELECT * FROM Win32_SerialPort"
	Using searcher As New ManagementObjectSearcher("root\CIMV2", qry)
		ports = searcher.Get().Cast(Of ManagementBaseObject)()	_
			.Select(Function(sp) New SerialPortInfo (CStr(sp("DeviceID")), CStr(sp("Caption")))) _
			.ToList() 
	End Using
	For Each mp As SerialPortInfo In ports
		Console.WriteLine("{0} - {1}", mp.ID, mp.Name)
	Next
End Sub

' Define other methods and classes here
Public Class SerialPortInfo
	
	Public Sub New(_id As String, _name As String)
		ID = _id
		Name = _name
	End Sub
	
	Public ID As String = ""
	Public Name As String = ""
	
End Class


CPallini

5.

Maciej Los

Спасибо, Карло.

Member 14563206

Большое вам спасибо за ответ, тем более что я никогда не мог себе представить такой маршрут (WMI) только через интернет-поиск!!

Я предполагаю, что WMI сгенерирует запрос примерно такой же, как в ссылке StackOverFlow, чтобы я просто вставил его в свой VB-код, как показано там????

Member 14563206

Правильно ли выглядит следующее?

strComputer = "."
Набор objWMIService = функция getobject("winmgmts:\\" &амп; strComputer &ампер; "\корень\пространстве имен cimv2")
Установите colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_SerialPort",,48)
Для каждого объекта в colItems
Объект WScript.Эхо "-----------------------------------"
Объект WScript.Echo "экземпляр Win32_SerialPort"
Объект WScript.Эхо "-----------------------------------"
Объект WScript.Эхо "имя:" & objItem.Name
Следующий

Maciej Los

Пожалуйста, ознакомьтесь с обновленным ответом.

Member 14563206

Большое вам спасибо!

Это совсем не то, что сгенерировано.
Несомненно, эта нить будет иметь ценность для многих других.

Прежде чем я начну реализовывать этот значительно отличающийся подход, не могли бы вы дать мне представление о том, почему многие подходы, которые я нашел в интернете, потерпели неудачу в моем случае?

Что делает мою ситуацию настолько отличной от всех других успешных случаев, которые я нашел в интернете?

Maciej Los

Всегда пожалуйста.

Ну, я понятия не имею ;)

Кстати: Пожалуйста, примите мой ответ как решение (зеленая кнопка).

Member 14563206

Я ТАК И СДЕЛАЮ!

Member 14563206

Я получаю ошибку:

Тип "ManagementObjectSearcher" не определен.

Это наводит на мысль:

Частный Класс ManagementObjectSearcher
Private v как строка
Частный qry в виде строки

Общественные Саб новый(в как строку, qry по состоянию строку)
Меня.в = в
Меня.qry по = qry по
Конец Подводной Лодки
End Класса


Что скажете вы?

Member 14563206

Я думаю, что получил ответ на свой последний вопрос здесь:

https://stackoverflow.com/questions/7813715/managementobjectsearcher-is-not-defined-even-after-adding-system-management-refe

Еще Раз Благодарю Вас!

Maciej Los

Рад слышать, что вы решаете проблему yourslef.

Удачи вам!

Ваше здоровье!
Мацей