Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как найти в системе нужный компорт?
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
juvf
Есть устройство, подключаемое через USB. В устройстве стоит FTDI (VCP) с дефолтными драйверами. Соответственно устройство в компе появляется как виртуальный компорт. Чтобы начать с устройством работать, необходимо вычислить имя компорта. Но можно в микросхему FTDI залить свои данные и на комп поставить свой(правленный от FTDI) драйвер. Тогда в системе будет появляться не просто "USB<->RS232 преобразователь (COM38)", а например "MyDevice (COM38)".

Как программно перебрать все порты в системе и найти тот компорт, у которого "id" == MyDevice ?

ps для Windows и для Linux.
Intel4004
Цитата(juvf @ Jul 22 2013, 13:04) *
Как программно перебрать все порты в системе и найти тот компорт, у которого "id" == MyDevice ?
ps для Windows и для Linux.

У меня под виндами так:

Код
typedef struct _SERIAL_LIST SERIAL_LIST;
struct _SERIAL_LIST
   {
   char* strName;
   char* strDescription;
   };
//---------------------------------------------------------------------------
unsigned long WINAPI __export Serial_GetPortList (SERIAL_LIST** ppPortList)
{
unsigned long ulPortListCount;
HKEY hkKey;
unsigned long ulIndex;
char* strValueName;
unsigned long ulValueNameSize;
unsigned long ulType;
char* strData;
unsigned long ulDataSize;
*ppPortList = NULL;
if (RegOpenKey(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", &hkKey) == ERROR_SUCCESS)
   {
   ulPortListCount = 0;
   *ppPortList = (SERIAL_LIST*)malloc(sizeof(SERIAL_LIST));
   (*ppPortList)->strName = NULL;
   (*ppPortList)->strDescription = NULL;
   ulIndex=0;
   ulValueNameSize = 255;
   strValueName = (char*)malloc(ulValueNameSize+1);
   ulDataSize = 255;  
   strData = (char*)malloc(ulDataSize+1);
   while (RegEnumValue(hkKey, ulIndex, strValueName, &ulValueNameSize, NULL, &ulType, strData, &ulDataSize) == ERROR_SUCCESS)
     {
     if (ulType == REG_SZ)
       if (ulDataSize >= 4)
         if (memcmp(strData, "COM", 3) == 0)
           {
           *ppPortList = (SERIAL_LIST*)realloc(*ppPortList, sizeof(SERIAL_LIST)*(ulPortListCount+2));
           ((*ppPortList)+ulPortListCount)->strName = (char*)malloc(strlen(strData)+1);
           ((*ppPortList)+ulPortListCount)->strDescription = (char*)malloc(strlen(strValueName)+1);
           strcpy(((*ppPortList)+ulPortListCount)->strName, strData);
           strcpy(((*ppPortList)+ulPortListCount)->strDescription, strValueName);
           ulPortListCount++;
           ((*ppPortList)+ulPortListCount)->strName = NULL;
           ((*ppPortList)+ulPortListCount)->strDescription = NULL;
           }
     ulIndex++;
     ulValueNameSize = 255;
     ulDataSize = 255;
     }
   free(strValueName);
   free(strData);
   RegCloseKey(hkKey);
   }
if (!ulPortListCount)
   {
   Serial_FreePortList(*ppPortList);
   *ppPortList = NULL;
   }
return ulPortListCount;
}
//---------------------------------------------------------------------------
void WINAPI __export Serial_FreePortList (SERIAL_LIST* pPortList)
{
SERIAL_LIST *pPort;
if (pPortList)
   {
   for (pPort=pPortList;pPort->strName || pPort->strDescription;pPort++)
     {
     free (pPort->strName);
     free (pPort->strDescription);
     }
   free (pPortList);
   }
}
//---------------------------------------------------------------------------
Kirill_Good
Цитата(juvf @ Jul 22 2013, 13:04) *
Есть устройство, подключаемое через USB. В устройстве стоит FTDI (VCP) с дефолтными драйверами. Соответственно устройство в компе появляется как виртуальный компорт. Чтобы начать с устройством работать, необходимо вычислить имя компорта. Но можно в микросхему FTDI залить свои данные и на комп поставить свой(правленный от FTDI) драйвер. Тогда в системе будет появляться не просто "USB<->RS232 преобразователь (COM38)", а например "MyDevice (COM38)".

Как программно перебрать все порты в системе и найти тот компорт, у которого "id" == MyDevice ?

ps для Windows и для Linux.

Не до конца уверен в том что говорю, но под Linux можно сделать соответствие между именем и устройством с помощью udev, если устройства втыкаются каждый раз в один и тот же физ порт. Или был вариант несколько модемов с интерфейсом com over usb, в системе они могли возникнуть с другими именами нежели забиты строкой в программе. был вариант отправлять команду вроде version и парсить ответ и определять кто есть кто. но под линукс должен уметь все делать udev. под windows не знаю, но сколько программ не видел (с gui, пользователь взаимодействует с по) везде вручную выбирался ком порт.
juvf
Цитата(Kirill_Good @ Jul 23 2013, 14:13) *
под windows не знаю, но сколько программ не видел (с gui, пользователь взаимодействует с по) везде вручную выбирался ком порт.

Ну вот в этом и беда. Модемы и прочие устройства подключались к реальным компортам по RS232. Такой компорт в системе был как "СОМ 1". Как не крути, в лучшем случае ты узнаешь, что это контроллер RS2323 и для автоматического определения устройства можно было открыть каждый порт и попытаться связаться. И портов было не много.... многие программы с gui до сих пор предлагают выбрать компорт из com1, com2, com3 и com4. Некоторые криворукие программисты до сих пор пишут гуи с выбором компорта из 4-х, продвинутые делают список из 10 компортов.

Но реального RS232 почти не осталось, сейчас в основном все компорты - это VCP через USB или TCP. А если есть возможность поменять в устройстве пид, вид, а также задать iProduct, iManufacturer и название устройства, и наблюдать всё это в системе - возника идея об автоматическом выборе компорта.


ps был у меня gprs модем Novatec выполнен как usb адаптер. При подключении его к компу в списке устройств появлялся новое устройство, типа "Novatec USB Modem" которому назначается COM27. Я, в своей программе, по старинке руками указывал номер компорта и работал с модемом как с компортом, слал атикоманды. Но штатная утилита от модема работала без назначения компорта. Т.е. она не требовала от пользователя в гуи выбор компорта.

pps сейчас у меня есть gprs модем от МТС. Тоже самое: в гуи ни каких назначений. Работает по ком34.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.