С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/56: Рейтинг темы: голосов - 56, средняя оценка - 4.89
добрый тапкожуй
11 / 11 / 3
Регистрация: 30.11.2011
Сообщений: 76
1

Получить имя устройства на COM-порте

23.04.2012, 17:02. Просмотров 10465. Ответов 20
Метки нет (Все метки)

Добрый день.

У меня есть несколько экземпляров класса SerialPort. Нужно получить имя устройства, подключенного на каждый из портов. Как это сделать?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2012, 17:02
Ответы с готовыми решениями:

Определить имя устройства на com порту
Доброго времени суток! есть считывающее устройство, поставил на него драйвера...

Подскажите пожалуйста как получить ответ от устройства через COM порт
Всем привет. Встал вопрос работы с устройством на COM порту. static...

Возможно ли получить данные с COM порта без физического устройства к нему подключенного?
Добрый день! Возможно ли получить данные с COM порта без физического...

Получить имя пользователя по IP-адресу
Возможно ли такое?

Получить имя и адрес DLL файла
Добрый день. Встала задача: 1. Получить имя и адрес DLL файла 2. Определить...

20
kolorotur
Эксперт .NET
10723 / 8881 / 2223
Регистрация: 17.09.2011
Сообщений: 15,272
Завершенные тесты: 1
23.04.2012, 17:16 2
Добрый день.
Отправить устройству запрос на получение его имени.
Формат запроса должен быть описан в технической документации устройства.
0
добрый тапкожуй
11 / 11 / 3
Регистрация: 30.11.2011
Сообщений: 76
23.04.2012, 17:26  [ТС] 3
Дело в том, что у меня есть модем, который при подключении его к компьютеру создает три виртуальных COM-порта, при этом один из них не отвечает на AT-команды, а два других отвечают.

Из этих двух оставшихся портов оба принимают AT-команды, по команде ATI выдают одну и ту же информацию, но при этом через один порт соединение можно установить, разорвать, и потом снова установить, а через другой соединение устанавливается, разрывается, а потом он перестает отвечать на команды и не дает соединиться тому порту, через которое соединение идет.

Таким образом, мне нужно из этих трех портов выбрать один, через который соединение можно установить корректно.

Добавлено через 4 минуты
GSM-модем, то есть втыкается в USB-порт
0
mikhail_g
188 / 143 / 27
Регистрация: 02.05.2011
Сообщений: 467
23.04.2012, 17:51 4
Посмотрите что у вас происходит в диспетчере устройств - создаются ли там в разделе "Последовательные порты" ваши СОМ порты.
Если да, то тогда, никак вы это не проверите, если только не будет посылать контрольный запрос подключенному устройств и анализировать ответ. Например установите ReadTimeOut необходимый для однозначной диагностики отказа вашего СОМ порта.
0
добрый тапкожуй
11 / 11 / 3
Регистрация: 30.11.2011
Сообщений: 76
23.04.2012, 17:54  [ТС] 5
Да, в диспетчере устройств создаются два COM-порта в разделе "COM-порты", и добавляется модем в раздел "Модемы", подключенный как раз к тому COM-порту, на который нужно передавать команды
0
добрый тапкожуй
11 / 11 / 3
Регистрация: 30.11.2011
Сообщений: 76
25.04.2012, 16:14  [ТС] 6
А как же диспетчер устройств определяет, на каком порте какое устройство?
0
kolorotur
Эксперт .NET
10723 / 8881 / 2223
Регистрация: 17.09.2011
Сообщений: 15,272
Завершенные тесты: 1
25.04.2012, 16:29 7
Цитата Сообщение от добрый тапкожуй Посмотреть сообщение
А как же диспетчер устройств определяет, на каком порте какое устройство?
Никак не определяет.
0
добрый тапкожуй
11 / 11 / 3
Регистрация: 30.11.2011
Сообщений: 76
25.04.2012, 16:35  [ТС] 8
Хм. Но ведь он пишет что-то вроде
Modem#1 (COM3)
Modem#2 (COM4)
Device(COM6)
Another_Device(COM7).

То есть он же каким-то образом устанавливает соответствие между номером порта и устройством. С помощью драйверов?
0
kolorotur
Эксперт .NET
10723 / 8881 / 2223
Регистрация: 17.09.2011
Сообщений: 15,272
Завершенные тесты: 1
25.04.2012, 16:55 9
А к COM1 подсоединен, получается, некий дивайс по имени Communications Port?

Нет, диспетчер задач просто пишет имя порта, а не устройства, к нему подсоединенного.
Стоит вот у меня в системе карта для видеозахвата DeckLink, на которой имеется COM-порт для управления автоматизацией и получения таймкода. В диспетчере этот порт так и обозначен:
Blackmagic RS422 Serial Port (COM6).

Хотя к самому порту подключено устройство автоматизации PebbleBeach Systems.

COM-порт - это, грубо говоря, "труба", в которую можно сливать данные. Даже если на другом конце эти данные никто не принимает - системе просто побоку.
Можете попробовать в коде открыть порт, к которому ничего не подсоединено и отсылать туда данные - проблем не возникнет, они просто будут уходить "в никуда".
0
добрый тапкожуй
11 / 11 / 3
Регистрация: 30.11.2011
Сообщений: 76
25.04.2012, 17:00  [ТС] 10
А как тогда получить полное имя порта?
Этот кусок кода
C#
1
2
3
SerialPort port = new SerialPort;
...
Console.Write(port.PortName);
выведет только "COM6", но не Blackmagic RS422 Serial Port (COM6)
0
kolorotur
Эксперт .NET
10723 / 8881 / 2223
Регистрация: 17.09.2011
Сообщений: 15,272
Завершенные тесты: 1
25.04.2012, 17:06 11
Цитата Сообщение от добрый тапкожуй Посмотреть сообщение
А как тогда получить полное имя порта?
Тут уже подсказать не могу - не знаю.
Наверное надо копаться где-то в реестре, где хранятся описания устройств. Может через WMI, а может и через WinAPI как-то достать можно.
1
добрый тапкожуй
11 / 11 / 3
Регистрация: 30.11.2011
Сообщений: 76
26.04.2012, 16:08  [ТС] 12
Лучший ответ Сообщение было отмечено как решение

Решение

Решил проблему с помощью WMI таким образом:

C#
1
2
3
4
5
6
7
8
9
string query = "SELECT * FROM Win32_POTSModem";
  string[] ModemObjects = new string[250];
  ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
  byte k = 0;
       foreach (ManagementObject obj in searcher.Get())
       {
                Console.WrieLine(obj["Name"].ToString + "("+obj["AttachedTo"].ToString() +")");
       }
  Console.ReadLine();
Подключал
C#
1
2
using System.Management;
using Microsoft.Win32;
и ссылку на System.Management надо добавить в проект перед тем, как использовать
3
kolorotur
Эксперт .NET
10723 / 8881 / 2223
Регистрация: 17.09.2011
Сообщений: 15,272
Завершенные тесты: 1
26.04.2012, 19:29 13
Спасибо за наводку!
Будем знать.
0
WOLF DIABLO
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 11
10.09.2013, 14:19 14
Цитата Сообщение от добрый тапкожуй Посмотреть сообщение
Решил проблему с помощью WMI таким образом:

C#
1
2
3
4
5
6
7
8
9
string query = "SELECT * FROM Win32_POTSModem";
  string[] ModemObjects = new string[250];
  ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
  byte k = 0;
       foreach (ManagementObject obj in searcher.Get())
       {
                Console.WrieLine(obj["Name"].ToString + "("+obj["AttachedTo"].ToString() +")");
       }
  Console.ReadLine();
Подключал
C#
1
2
using System.Management;
using Microsoft.Win32;
и ссылку на System.Management надо добавить в проект перед тем, как использовать


на строке
C#
1
Console.WriteLine(obj["Name"].ToString + "(" + obj["AttachedTo"].ToString() + ")");
выдает

Ошибка 1 Оператор "+" не может применяться к операндам типа "группа методов" и "string" d:\СИ\astr\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 1366 37 WindowsFormsApplication1
0
kolorotur
Эксперт .NET
10723 / 8881 / 2223
Регистрация: 17.09.2011
Сообщений: 15,272
Завершенные тесты: 1
10.09.2013, 15:20 15
WOLF DIABLO, Тапкожуй забыл при вызове ToString скобки дописать.
1
WOLF DIABLO
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 11
11.09.2013, 14:53 16
C#
1
2
3
4
5
6
7
8
9
10
11
            
            string query = "SELECT * FROM Win32_POTSModem";
            string[] ModemObjects = new string[250];
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
            byte k = 0;
            foreach (ManagementObject obj in searcher.Get())
            {                  
                ModemObjects[k] = obj["Name"].ToString() + "(" + obj["AttachedTo"].ToString() + ")";
                k+=1;
            
            }
смотрю в отладчике значения
ModemObjects - имею массив с одним значением ("Программный модем PCI CX11252-11(COM3)")
вообще в системе 3 COM порта
два отображаются в устройствах- порты
третий - этот модем.
необходимо знать имена всех портов (или на крайняк имена портов отображаемых в диспетере- порты

попробовал использовать функцию для портов
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
           string query = "SELECT * FROM Win32_SerialPort";
       
            string[] ModemObjects = new string[250];
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
            byte k = 0;
            foreach (ManagementObject obj in searcher.Get())
            {
               
       
                  ModemObjects[k] = obj["Name"].ToString() + "(" + obj["AttachedTo"].ToString() + ")";
                k+=1;
            
            }
при работе выдает -
ManagementException не обработанно
Not found
на строке
C#
1
ModemObjects[k] = obj["Name"].ToString() + "(" + obj["AttachedTo"].ToString() + ")";
0
Spectral-Owl
576 / 554 / 155
Регистрация: 29.06.2010
Сообщений: 1,588
Завершенные тесты: 1
11.09.2013, 15:12 17

Не по теме:

WOLF DIABLO, а ты ещё тот некропостер...



Добавлено через 3 минуты
Цитата Сообщение от WOLF DIABLO Посмотреть сообщение
необходимо знать имена всех портов (или на крайняк имена портов отображаемых в диспетере- порты
C#
1
System.IO.Ports.SerialPort.GetPortNames() //возвращает имена всех доступных (в том числе и занятных) COM портов
1
WOLF DIABLO
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 11
11.09.2013, 15:16 18
Не по теме: люблю некромантов )))

Цитата Сообщение от Spectral-Owl Посмотреть сообщение
1
System.IO.Ports.SerialPort.GetPortNames()
порты то понятно как))) но там дает только имя порта COM1, COM3 и т.д
а мне нужны имена устройств подключеных к эти портам как в диспетчере
т.е условно
Последовательный порт (COM1)
и т.д.
0
Spectral-Owl
576 / 554 / 155
Регистрация: 29.06.2010
Сообщений: 1,588
Завершенные тесты: 1
11.09.2013, 16:45 19
Цитата Сообщение от WOLF DIABLO Посмотреть сообщение
C#
1
string query = "SELECT * FROM Win32_SerialPort";
в свою очередь возвращает не все порты.

а так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Management;
 
public class Sample
{
    public static void Main(string[] args)
    {
        string query = "SELECT * FROM Win32_SerialPort";
        string[] ModemObjects = new string[250];
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
 
 
        foreach (ManagementObject service in searcher.Get())
        {
            Console.WriteLine(service.ToString());
            Console.WriteLine(service.GetText(TextFormat.Mof));
            Console.Read();
        }
 
        Console.Read();
    }
}
GetText возвращает много всякой бурды, тебе нужна строка 5: Caption (или хз какая по счету: Description (или, аналогично, Name)). черт его знает как обратиться именно к ним не через этот ужесный метод, но строку если что выделить просто.
0
Spectral-Owl
576 / 554 / 155
Регистрация: 29.06.2010
Сообщений: 1,588
Завершенные тесты: 1
11.09.2013, 16:52 20
оу, забыл прочитать что тут обсуждалось, обратиться оказалось просто)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Management;
 
public class Sample
{
    public static void Main(string[] args)
    {
        string query = "SELECT * FROM Win32_SerialPort";
        string[] ModemObjects = new string[250];
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
 
 
        foreach (ManagementObject service in searcher.Get())
        {
            Console.WriteLine(service.ToString());
            Console.WriteLine(service["Name"]);
            Console.WriteLine(service["Caption"]);
            Console.WriteLine(service["Description"]);
            Console.Read();
        }
 
        Console.Read();
    }
}
прямо как в диспетчере и выводит)
0
Миниатюры
Получить имя устройства на COM-порте  
11.09.2013, 16:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2013, 16:52

Получить имя процесса зная handle
кому-то да понадобиться вот код : private static extern...

Получить имя файла, приложенного к письму
Добрый день! У меня написан на c# небольшой почтовый клиент, который читает...

Через функцию CreateToolhelp32Snapshot получить имя процесса
возник новый вопрос=) через винапишную функцию CreateToolhelp32Snapshot(....)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru