在C++中打开一个数字高于9的COM端口

Jar*_*aro 8 c++ ports

我在C++中使用COM端口.我无法打开数字大于9的COM端口,例如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;

}
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么例如COM10,将FFFFFFFF抛回HANDLE hPort.

hPort = CreateFile(L"COM10", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
Run Code Online (Sandbox Code Playgroud)

COM9,COM8,COM7等工作正常,

hPort = CreateFile(L"COM9", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
Run Code Online (Sandbox Code Playgroud)

它有解决这个问题的方法吗?

Jee*_*eva 21

这是一个错误,解决方法是使用字符串

\\.\COM10

hPort = CreateFile("\\\\.\\COM10", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
Run Code Online (Sandbox Code Playgroud)

看看这篇文章.


小智 8

对于大于9的COM端口,您需要使用以下格式:

\\\\.\\COM%d
Run Code Online (Sandbox Code Playgroud)

哪里%d是端口号的printf替换.

为什么?好吧,这会访问存储所有对象的全局NT对象空间.Windows只知道您使用它支持DOS的方式的别名COM0-9; 除此之外,它们就像普通设备一样,以这种方式访问​​.

为了探索NT对象空间,我推荐WinObj,它基本上可以让你浏览.\.\映射GLOBAL??到此树中(实际上也是一些其他区域.树的其余部分要求你有NT,而不是Win32的系统视图).

如果您不知道,INVALID_HANDLE_VALUE则定义为0xffffff...- 这通常发生在打开失败时.