crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как получить список COM-портов в MS Windows?
Litkevich Yuriy
  опции профиля:
сообщение 16.10.2008, 21:21
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Есть ли ветка в реестре которая содержит список COM-портов?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 17.10.2008, 7:52
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


В реестре есть, но не помню где, вот так можно получить список:
#include <windows.h>
#include <TCHAR.H >
#include <conio.h>
#include <stdio.h>

void EnumerateSerialPorts()
{
    // В какой системе работаем?
    OSVERSIONINFO osvi;
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    BOOL bGetVer = GetVersionEx(&osvi);

    // В NT используем API QueryDosDevice
    if(bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))
    {
        // Используем QueryDosDevice для просмотра всех устройств похожих на COMx.
        // Это наилучшее решение, так как порты не требуется открывать
        TCHAR szDevices[65535];
        DWORD dwChars = QueryDosDevice(NULL, szDevices, 65535);
        if(dwChars)
        {
            int i=0;
            for (;;)
            {
                // Получаем текущее имя устройства
                TCHAR* pszCurrentDevice = &szDevices[i];
                
                // Если похоже на "COMX" выводим на экран
                int nLen = _tcslen(pszCurrentDevice);
                if(nLen > 3 && _tcsnicmp(pszCurrentDevice, _T("COM"), 3) == 0)
                {
                    printf(pszCurrentDevice);
                    printf("\n");
                }
                // Переходим к следующему символу терминатору
                while(szDevices[i] != _T('\0'))
                    i++;

                // Перескакиваем на следующую строку
                i++;
                
                // Список завершается двойным симмволом терминатором, так что если символ
                // NULL, мы дошли до конца
                if(szDevices[i] == _T('\0'))
                    break;
            }
        }
    }
    else
    {
        // В 95/98 открываем каждый порт для определения его существования
        // Поддерживается до 255 COM портов, так что мы проходим пл всему списку
        // Если мы не можем открыть порт, или происходит ошибка при открытии,
        // получаем access denied или общую ошибку все эти случаи указывают на
        // то, что под таким номером есть порт.
        for (UINT i=1; i<256; i++)
        {
            // Формируем сырое имя устройства
            char sPort[10];
            sprintf(sPort,"\\\\.\\COM%d", i);
            
            // Пытаемся открыть каждый порт
            BOOL bSuccess = FALSE;
            HANDLE hPort = ::CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
            if(hPort == INVALID_HANDLE_VALUE)
            {
                DWORD dwError = GetLastError();
                
                // Смотрим что получилось при открытии
                if(dwError == ERROR_ACCESS_DENIED || dwError == ERROR_GEN_FAILURE)
                    bSuccess = TRUE;
            }
            else
            {
                // Порт открыт успешно
                bSuccess = TRUE;
                
                // Не забываем закрывать каждый открытый порт,
                // так как мы не собираемся с ним работать...
                CloseHandle(hPort);
            }

            // Выводим на экран название порта
            if(bSuccess)
            {
                printf(sPort);
                printf("\n");
            }
        }
    }
}

int main()
{
    EnumerateSerialPorts();
    getch();
    return 0;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.10.2008, 10:06
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


да я умышленно про реестр, к нему из разных библиотек доступ получить можно, как я понимаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 11.7.2020, 17:22