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

Posted

技术标签:

【中文标题】在 C++ 中打开一个大于 9 的 COM 端口【英文标题】:Open a COM port in C++ with number higher that 9 【发布时间】:2012-07-31 06:57:31 【问题描述】:

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

这个问题有解决办法吗?

【问题讨论】:

顺便说一下,串口检测方法比较复杂。在 Windows 注册表中有一个键 HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM 用于系统中可用的串行端口。 【参考方案1】:

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

\\\\.\\COM%d

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

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

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

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

【讨论】:

【参考方案2】:

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

\\.\COM10

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

查看this 文章。

【讨论】:

感谢这个答案使我免于精神错乱:)

以上是关于在 C++ 中打开一个大于 9 的 COM 端口的主要内容,如果未能解决你的问题,请参考以下文章

打开串口(COM)号大于9时报错

linux 端口被占用,linux端口号被占用解决方法

COM口 大于9 连接不上问题总结

串口C++问题

大于 9 的数字的 C++ char 到 int 转换

【Windows编程问题!!】C++根据端口号,获取对应的进程PID,但是有的端口怎么也找不到对应进程,WHY??