Откройте COM-порт в C++ с номером выше 9

Я использую COM-порт в C++. Я не могу открыть COM-порты с большим числом, чем 9, например 10. Это функция, используемая для обнаружения COM-порта:

WCHAR port_name[7];
WCHAR num_port[4];        

for (i=1; i<256; i++)
{
    bool bSuccess = false;

    wcscpy(port_name,L"COM");
    wcscat(port_name,_itow(i,num_port,10));

    HANDLE hPort;

    //Try to open the port
    hPort = CreateFile(L"COM10", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
    //hPort = CreateFile(port_name, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

    if (hPort == INVALID_HANDLE_VALUE)
    {
        DWORD dwError = GetLastError();

        //Check to see if the error was because some other application had the port open
        if (dwError == ERROR_ACCESS_DENIED)
        {
            bSuccess = TRUE;
            j=j+1;  
        }
    }
    else   //The port was opened successfully
    {            
        bSuccess = TRUE;
        j=j+1;

        CloseHandle(hPort);   //closing the port
    }

    if (bSuccess)array_ports[j]=i;

}

Я не могу понять, почему, например, COM10, бросает FFFFFFFF обратно для обработки hPort.

hPort = CreateFile(L"COM10", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

com9, то COM8, резолюцию com7, и т. д. отлично работает,

hPort = CreateFile(L"COM9", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

Это там решение для этой проблемы?

2 ответов


это ошибка, и разрешение должно использовать строку

\.\COM10

hPort = CreateFile("\\.\COM10", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

Регистрация этой статьи.


для COM-портов больше 9 необходимо использовать следующий формат:

\\.\COM%d

здесь %d является printf-подстановкой для номера порта.

почему? Ну, это доступ к глобальному объектному пространству NT, где хранятся все объекты. Windows знает только псевдоним COM0-9 так, как вы используете его для поддержки DOS; кроме того, они действуют как обычные устройства, к которым обращаются таким образом.

чтобы исследовать пространство объектов NT, я рекомендую WinObj что в основном позволяет просматривать вокруг. \.\ сопоставляется с GLOBAL?? в этом дереве (как и некоторые другие области, на самом деле. Остального дерева требует у вас НТ по сравнению с Win32, вид системы).

и на всякий случай, если вы не знали,INVALID_HANDLE_VALUE определяется как 0xffffff... - обычно это происходит при сбое open.