Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2014, 16:58   #1
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию Получить имя com-порта к которому подключено устройство

Здравствуйте. Весь код выкладывать не имеет смысла, буду краток.
Есть указатель HDEVINFO hDevInfo и есть структура SP_DEVINFO_DATA spDevInfoData Все заполнено и с помощью функции SetupDiGetDeviceRegistryProperty я могу получить информацию об устройстве, используя определенные флаги SPDRP_*, но не могу получить имя com-порта на котором это устройство висит.
Нашел такой способ:
Код:
HKEY hKey = SetupDiOpenDevRegKey(hDevInfo, & spDevInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
Функция не заканчивается ошибкой, hKey получает указатель на область памяти 0x0000004b, но не идентифицирует ее как доступную и пишет
Код:
unused = ???
, в результате чего работать с переменной hKey я уже не могу, потому что все остальные функции, где я ее использую выдают ошибки.
У меня права администратора.
Подскажите пожалуйста, что я делаю неправильно?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 05.06.2014, 17:18   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

GetLastError что говорит?
p51x на форуме Ответить с цитированием
Старый 05.06.2014, 17:26   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

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

Последний раз редактировалось waleri; 05.06.2014 в 17:28.
waleri вне форума Ответить с цитированием
Старый 05.06.2014, 18:09   #4
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Код:
#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>

#include <Windows.h>
#include <SetupAPI.h>
#include <cfgmgr32.h>
#include <devguid.h>
#include <iostream>
Код:
#include "stdafx.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	DWORD error = NULL;
	HDEVINFO hDevInfo = SetupDiGetClassDevs((GUID*)&GUID_DEVCLASS_MODEM, TEXT("USB"), NULL, DIGCF_PRESENT);

	if (hDevInfo == INVALID_HANDLE_VALUE)
	{
		error = GetLastError();
		return 0;
	}

	SP_DEVINFO_DATA spDevInfoData;
	memset(&spDevInfoData, NULL, sizeof(SP_DEVINFO_DATA));
	spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

	for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)
	{
		HKEY hKey = SetupDiOpenDevRegKey(hDevInfo, &spDevInfoData, DICS_FLAG_GLOBAL, NULL, DIREG_DEV, KEY_READ);

		if (hKey == INVALID_HANDLE_VALUE)
		{
			error = GetLastError();
			return 0;
		}
	}

	return 0;
}
Как обычно сам задаю вопрос и сам же на него отвечаю. Не важно, что хэндл получается unused. RegQueryValueEx в эту функцию я неверный параметр писал. Вопрос решен. Надо делать так:
Код:
DWORD dwType = 0;
DWORD dwDataSize = 0;
LONG nError = RegQueryValueEx(hKey, _T("PortName"), NULL, &dwType, NULL, &dwDataSize);
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 05.06.2014 в 19:10. Причина: Вопрос решен
ImmortalAlexSan вне форума Ответить с цитированием
Старый 05.06.2014, 21:28   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Описание API вызова библиотеки GetNumCom.DLL (через SetupAPI):
Screen0.jpg
http://www.youtube.com/watch?v=F1SBCI7BglQ

p.s.: данная информация доступна через SetupAPI/WMI/реестр. Служба WMI на чистых осях по-умолчанию отключена. Реестр может быть заблокирован настройками антивируса или политиками безопасности.
Вложения
Тип файла: zip Описание API вызова библиотеки GetNumCom.DLL.zip (335.2 Кб, 52 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 05.06.2014 в 21:30.
raxp вне форума Ответить с цитированием
Старый 26.01.2016, 06:38   #6
bakunin
Новичок
Джуниор
 
Регистрация: 26.01.2016
Сообщений: 2
Вопрос

А если усложнить задачку (она реальная).
Имеем 5 одновременно подключенных устройств (все на FTDI).
2 одного типа, 3 - другого. Для каждого типа своя программа, запущенная либо по одному экземпляру и по очереди работает со своими типами. Либо запущены несколько экземпляров по количеству приборов.
Списки легко формируются по DeviceDescription (код типа прибора, в USBDeview = Device Name) и DeviceSerialNo (совпадает с зав.номером изделия). В реестр не заносится Device Name - он считывается с подключенной FTDI. Остальные параметры "\??\USB#VID_0403&PID_6001#15021103 #{a..." могут быть одинаковыми. 15021103 - это серийный номер железяки, он уникален только для одного типа изделия. PID менять не хотелось бы.

Какие есть идеи, как это все подключить.?
bakunin вне форума Ответить с цитированием
Старый 26.01.2016, 07:47   #7
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Для FTDI и использовать API от FTDI для идентификации. D2XX. К тому же, даже для одинаковых FTDI всегда можно сменить через FT_Prog имя для чипа, так что проблема идентификации для нескольких одинаковых чипов решаема.

И к слову, раз речь про FTDI, то и считывать-записывать желательно через их же API, т.е. библиотеку и драйвер напрямую, минуя виртуальный COM порт. Это тупо быстрее и удобнее, ибо API содержит все для обнаружения подключенного устройства с соответствующими идентификаторами.
kutani вне форума Ответить с цитированием
Старый 27.01.2016, 01:21   #8
bakunin
Новичок
Джуниор
 
Регистрация: 26.01.2016
Сообщений: 2
По умолчанию

Есть одно небольшое "но". При считывании через D2XX теряются данные. Не всегда, но часто. И количество потерянных байт разное. Через VCP таких проблем нет.
bakunin вне форума Ответить с цитированием
Старый 27.01.2016, 07:39   #9
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

...значит у вас корявый алгоритм считывания. Работаю с потоком данных 10 мегабайт/сек с Link-порта через FPGA в USB через FT2232H и API FTDI D2XX. Ни одного потерянного байта.
kutani вне форума Ответить с цитированием
Старый 12.04.2016, 13:34   #10
Cha1000000
Пользователь
 
Регистрация: 08.05.2014
Сообщений: 17
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
Описание API вызова библиотеки GetNumCom.DLL (через SetupAPI):
А как её в проекте С++ подключить и вызвать функцию gets?
Точнее как подключить dll понятно, а как правильно задать прототип вызываемой функции gets, уточните пожалуйста.

Последний раз редактировалось Cha1000000; 12.04.2016 в 14:20.
Cha1000000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить данные с СОМ-порта Lampard7 Win Api 0 19.10.2011 19:48
Как правильно получить дескриптор на устройство Master_Devel Win Api 2 24.05.2011 23:54
Функция CallWndProc. Получить путь к папке или файлу к которому преднозначено сообщение Irat Помощь студентам 1 16.02.2008 23:36
Проверить подключено ли устройство к usb Иллидан Win Api 7 19.01.2008 23:26
Как получить данные с COM-порта или другого любого порта? DeLure Общие вопросы C/C++ 5 20.09.2007 00:50