реклама на сайте
подробности

 
 
> Как найти в системе нужный компорт?
juvf
сообщение Jul 22 2013, 09:04
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Есть устройство, подключаемое через USB. В устройстве стоит FTDI (VCP) с дефолтными драйверами. Соответственно устройство в компе появляется как виртуальный компорт. Чтобы начать с устройством работать, необходимо вычислить имя компорта. Но можно в микросхему FTDI залить свои данные и на комп поставить свой(правленный от FTDI) драйвер. Тогда в системе будет появляться не просто "USB<->RS232 преобразователь (COM38)", а например "MyDevice (COM38)".

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

ps для Windows и для Linux.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Intel4004
сообщение Jul 22 2013, 09:17
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 7-09-07
Из: Наб.Челны
Пользователь №: 30 364



Цитата(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);
   }
}
//---------------------------------------------------------------------------
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 15:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01375 секунд с 7
ELECTRONIX ©2004-2016