2012-08-02 32 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... - 這通常發生在打開失敗時。