Jump to content

    
Sign in to follow this  
juvf

Как найти в системе нужный компорт?

Recommended Posts

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

 

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

 

ps для Windows и для Linux.

Share this post


Link to post
Share on other sites
Как программно перебрать все порты в системе и найти тот компорт, у которого "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);
   }
}
//---------------------------------------------------------------------------

Share this post


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

 

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

 

ps для Windows и для Linux.

Не до конца уверен в том что говорю, но под Linux можно сделать соответствие между именем и устройством с помощью udev, если устройства втыкаются каждый раз в один и тот же физ порт. Или был вариант несколько модемов с интерфейсом com over usb, в системе они могли возникнуть с другими именами нежели забиты строкой в программе. был вариант отправлять команду вроде version и парсить ответ и определять кто есть кто. но под линукс должен уметь все делать udev. под windows не знаю, но сколько программ не видел (с gui, пользователь взаимодействует с по) везде вручную выбирался ком порт.

Share this post


Link to post
Share on other sites
под 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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this