Автоконнект с контроллерным устройством по COM порту

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Я свожу к тому, что есть API для этого. Вообще, в винде стоит держаться подальше от реестра.
Данный кусок кода, который я выложил, получает список COM портов из системы, а потом перебирает его, пытаясь открыть порты из полученного списка.
Если "файл" не удаётся создать, значит, порт помечается, как занятый или недоступный. В перебор можно добавить и запрос на свободных портах. Получив ответ, можно вернуть основной программе номер порта. (считайте, HANDLE уже открыт. Можно продолжать работу.)
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Код: Выделить всё

Вообще, в винде стоит держаться подальше от реестра.
C чего бы это ???
Ну то же самое, только не на билдере

Код: Выделить всё

int Cset::GetCurrentPort()
{
	m_combo_port.ResetContent();
	int nCom=0;
	HKEY hKey;
	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
		KEY_COM,
		0,
		KEY_QUERY_VALUE,
		&hKey)!=ERROR_SUCCESS)return 0;
	int  NumVal=0;
	char * pValue0=new char[40];
	char * pValue1=new char[40];
	DWORD cValue1=40,cValue0=40,Type,a;
	while (!(a=RegEnumValue(hKey,NumVal++,pValue0,&cValue0,NULL,&Type,(LPBYTE)pValue1,&cValue1))||a==ERROR_MORE_DATA)
	{
		m_combo_port.AddString(pValue1);
		cValue1=cValue0=40;
		nCom++;
	}      
	delete pValue1;
	delete pValue0;
	m_combo_port.SetCurSel(0);
	return nCom;
}
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

urry писал(а):C чего бы это ???
Реестр - штука хрупкая. Скелет ОСи. Ошибочный атрибут при обращении к нему, может вызвать проблемы разного рода, вплоть до полного краха не то, что бы программы, а всей системы целиком.
Так же некоторый гемор может возникать при отсутствии прав на чтение и модификацию реестра. Есть стандартный API, реализованный в тонне DLL файлов системы, позволяющий выполнять более безопасные операции в системе. А к реестру лучше обращаться только в исключительных случаях, когда невозможно осуществить какую-либо операцию другим, более безопасным методом.

Прошу не спорить, это моё мнение.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

DX168B писал(а):
urry писал(а):C чего бы это ???
Реестр - штука хрупкая. Скелет ОСи. Ошибочный атрибут при обращении к нему, может вызвать проблемы разного рода, вплоть до полного краха не то, что бы программы, а всей системы целиком.
Дак если нам всегото надо подсмотреть доступные порты в системе, разве это может както повлиять на систему (ладно если бы мы там чтото меняли).
Поясните, поподробнее, в чем минус, определения доступных портов через реестр?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Первый минус, это права доступа. Программа может не работать на машине с жёстко урезанными правами доступа. Про остальное я уже написал. :)
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Сообщение BorisSPB »

DX168B писал(а):Первый минус, это права доступа. ...
Реестр для того и создан, чтобы им пользоваться. Если нельзя открыть ветку SERIALCOMM для чтения, то это скорее всего ошибка администратора. Если программа нужна, то всегда есть возможность предоставить ей необходимые права.
И еще, просто хочется высказаться по теме, предполагать, что номера портов ограничиваются числом 255 совершенно неправильно. База данных последовательного перечислителя неограничена.
И напоследок, я считаю, что лучше пользоваться сервисами типа SetupDiGetClassDevsEx, CM_Get_Device_Interface_List и т.п. С их помощью можно получить всю необходимую информацию, в том числе и путь к устройству который можно использовать при вызове CreateFile.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Кстати, такой вопрос. Я пытаюсь открыть порт, номер которого больше 10 (COM10 и выше) через CreateFile(), а он не открывается. Выкидывает ошибку открытия порта. Кто подскажет, с чем это связано?
Порты COM1...COM9 открываются нормально.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Код: Выделить всё

"\\\\.\\COM10"
Так и записываю номер порта. Но:
ПРИМЕНЯЕТСЯ К

Microsoft Win32 API, при использовании с:
Microsoft Windows 95
Издание стандарта Microsoft Windows 98
Microsoft Windows 2000 Standard Edition
Microsoft Windows Millennium Edition
Microsoft Windows NT 4.0
операционная система: Microsoft Windows XP
Про семёрку ничего не сказано. А у меня именно Win7. Ладно, попробую разобраться. Спасибо, что подсказали. :beer:
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

BorisSPB писал(а):И еще, просто хочется высказаться по теме, предполагать, что номера портов ограничиваются числом 255 совершенно неправильно. База данных последовательного перечислителя неограничена.
Ну, перебор дальше 255-го порта, явно не имеет смысла, а меньше - непонятно где нужно остановиться? Например я наблюдал виртуальные порты с номерами до нескольких десятков, ну и соотв с запасом щитаем до 255-го.
DX168B писал(а):Кстати, такой вопрос. Я пытаюсь открыть порт, номер которого больше 10 (COM10 и выше) через CreateFile(), а он не открывается. Выкидывает ошибку открытия порта. Кто подскажет, с чем это связано?
Порты COM1...COM9 открываются нормально.
http://ru.wikibooks.org/wiki/COM-%EF%EE ... %ED%E8%E5)
Заголовок lpFileName

Ну еще глянь как у меня сделано http://asis-kbr.ru/forum/viewtopic.php?f=9&t=115, в исходнике. Скорее всего еще где то ошибка, раз со слэшами разобрался.... У меня нормально прогоняет до последнего 255-го и Win7 стоит.
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Сообщение BorisSPB »

shads писал(а):Ну, перебор дальше 255-го порта, явно не имеет смысла
Вообще-то, наибольший номер порта который я видел - это COM385, что явно больше 255. Это на рабочем компьютере к которому подключали множество переходников USB-COM в течение некоторого времени. Кстати если пользователь ограничен в правах, нет возможности поставить номер поменьше (к вопросу о работе с реестром и правах).
Я понимаю почему не любят Setup API - очень муторно перебирать дерево устройств и интерфейсов, но это скорее всего самый правильный способ.
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

shads писал(а): http://ru.wikibooks.org/wiki/COM-%EF%EE ... %ED%E8%E5)
Заголовок lpFileName

Ну еще глянь как у меня сделано http://asis-kbr.ru/forum/viewtopic.php?f=9&t=115, в исходнике. Скорее всего еще где то ошибка, раз со слэшами разобрался.... У меня нормально прогоняет до последнего 255-го и Win7 стоит.
Заработало после перезагрузки компа. Видать, тупизм семёрки был. Спасибо за помощь. :beer:
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

BorisSPB писал(а):Вообще-то, наибольший номер порта который я видел - это COM385, что явно больше 255. Это на рабочем компьютере к которому подключали множество переходников USB-COM в течение некоторого времени.
БЕДНЫЙ КОМПЮТЕР..... если у него есть COM порт с номером 385.... (при условии конечно что его не специально таким выставили).
Этож скока в него переходников нужно было вставить, разных причем.

Ну если серьезно, то конечно для таких условий работы компа, и подход к разработке софта наверное будет особым.
Т.е. это уже программы разработанные профессионалами, а не котами, которые чешут языками, одни - надо вот так!, другие - да нет, вот так! .....
Последний раз редактировалось shads Сб мар 24, 2012 22:07:18, всего редактировалось 2 раза.
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

У меня было тоже дохрена портов, так как через этот комп прошло множество девайсов с чипом FT232RL.
Только я периодически удаляю из устройств ненужные порты. А то, потом набирается их over9000.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Сообщение Flasher »

Конечно профессионалами :) Особенно на FT232RL. Профессионал бы позаботился о D2X и нах всякие VCP...
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Flasher писал(а):Конечно профессионалами :) Особенно на FT232RL. Профессионал бы позаботился о D2X и нах всякие VCP...
Вас никто за язык не тянул. Теперь вот, объясняйте для первоклашек, что такое D2X ?
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

DX168B писал(а):У меня было тоже дохрена портов, так как через этот комп прошло множество девайсов с чипом FT232RL.
Только я периодически удаляю из устройств ненужные порты. А то, потом набирается их over9000.
Кстати, а как можно быстро очистить список зарезервированных портов?
Вот ща например у меня 5 устройств с виртуальными портами. Когда я открываю свойства одного из них, вкладку параметры порта, дополнительно, номер ком порта - вижу занятые первые 22 порта.
Конечно можно нужный порт принудительно загнать на зарезервированный, но, не используемый сейчас, но это как то насильственно выглядит. Мож есть какаято процедура по очистке таблицы виртуальных портов? Как это вы делаете?
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Flasher писал(а):http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer's_Guide(FT_000071).pdf
чтото вроде PDF должен открыватся, а открывается страница какаято? (подправьте ссылочку пож.)

Ой, все, открылся (я скопировал ссылочку с моего сообщ), интересно конечно (но правда ничого не понятно. Не русские мы.)
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Чтобы удалить скрытые устройства, нужно их отобразить в диспетчере устройств.
Делается так:
Создаём батник, в который записываем следующие команды:

Код: Выделить всё

set devmgr_show_nonpresent_devices=1
start devmgmt.msc
Сохраняем и запускаем его.
Откроется диспетчер устройств. В его меню "Вид" выбираем "Показать скрытые устройства"
Удаляем лишние устройства из "Другие устройства" и из "Порты COM и LPT" или перенастраиваем их на другие номера, если удалять не надо.

После закрытия Диспетчера устройств и консоли, переменная devmgr_show_nonpresent_devices обнуляется.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Ответить

Вернуться в «Интеграция с ПК»