juvf 10 22 июля, 2013 Опубликовано 22 июля, 2013 · Жалоба Есть устройство, подключаемое через USB. В устройстве стоит FTDI (VCP) с дефолтными драйверами. Соответственно устройство в компе появляется как виртуальный компорт. Чтобы начать с устройством работать, необходимо вычислить имя компорта. Но можно в микросхему FTDI залить свои данные и на комп поставить свой(правленный от FTDI) драйвер. Тогда в системе будет появляться не просто "USB<->RS232 преобразователь (COM38)", а например "MyDevice (COM38)". Как программно перебрать все порты в системе и найти тот компорт, у которого "id" == MyDevice ? ps для Windows и для Linux. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 2 22 июля, 2013 Опубликовано 22 июля, 2013 · Жалоба Как программно перебрать все порты в системе и найти тот компорт, у которого "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); } } //--------------------------------------------------------------------------- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
superdetka 0 23 июля, 2013 Опубликовано 23 июля, 2013 · Жалоба Есть устройство, подключаемое через 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 10 24 июля, 2013 Опубликовано 24 июля, 2013 · Жалоба под 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться