2012-08-02 61 views
6

我在C++中使用COM端口。我不能超过9较高数量的打开COM端口,例如10用于COM端口检测这是功能:在C++中打开一个COM端口号码高于9

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

它有一个对这个问题的解决方案?

+2

顺便说一句,这是一个复杂的串口检测方式。在Windows注册表中有一个用于系统中可用串行端口的HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ SERIALCOMM。 – pmed 2012-08-02 11:10:54

回答

16

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

\\.\COM10 

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

检查this文章。

+0

我修复了答案 – Jeeva 2012-08-02 10:14:12

+0

Great L“\\\\。\\ COM”正常工作!谢谢:) – Jaro 2012-08-02 13:50:08

+0

不明白。我必须使用unicode进行编译吗? – Anonymous 2014-12-09 18:09:47

7

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

\\\\.\\COM%d 

%d是一个printf-取代的端口号。

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

要探索NT对象空间,我推荐WinObj,它基本上让你浏览。 \。\被映射到GLOBAL??这棵树(就像其他一些区域一样,其余的树要求你有NT,而不是Win32的系统视图)。

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