Перейти к содержанию
    

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

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

 

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

 

ps для Windows и для Linux.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

ps для Windows и для Linux.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

под 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...