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

Open a COM port in C++ with number higher that 9

本文关键字:大于 数字 一个 端口 COM C++      更新时间:2023-10-16

我在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;
}

我不明白为什么COM10会把FFFFFFFF丢回HANDLE 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);

这个问题有解决办法吗?

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

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

查看这篇文章。

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

\\.\COM%d

其中%d是端口号的printf替换。

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

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

万一你不知道,INVALID_HANDLE_VALUE被定义为0xffffff...——这通常发生在打开失败时。