2012-08-02 24 views
6

C++' da bir COM bağlantı noktasını kullanıyorum. I Örnek 10. COM portu tespiti için kullanılan Bu işlev için, 9 daha yüksek bir sayı ile COM portu açamaz: örneğin COM10 için, hPort KOLU geri FFFFFFFF atar neden anlayamıyorumC++ 'da bir COM bağlantı noktası açın, bu sayı 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; 

} 

. vb COM9, COM8 COM7, gayet iyi çalışıyor

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

, bu sorun için

hPort = CreateFile(L"COM9", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); 

Orada bir çözüm?

+2

Bu arada, seri bağlantı noktası algılama için karmaşık bir yol. Sistemde bulunan seri bağlantı noktaları için Windows Kayıt Defteri'nde HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ SERIALCOMM anahtar bulunmaktadır. – pmed

cevap

16

Bu bir hata olduğunu ve çözünürlük dize

\\.\COM10 

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

onay this makale kullanmaktır.

+0

Yanıtı çözdüm – Jeeva

+0

Büyük L "\\\\. \\ COM" çalışıyor! Teşekkürler :) – Jaro

+0

Anlamadım. Unicode ile derlemek zorunda mıyım? – Anonymous

7

9'dan daha büyük COM bağlantı noktaları için aşağıdaki biçimi kullanmak gerekir: %d port numarası için bir Printf-substitusyondur

\\\\.\\COM%d 

.

Neden? Bu, tüm nesnelerin depolandığı genel NT nesne alanına erişir. Windows, sadece COM0-9 takma adını DOS desteği için kullandığınız şekilde bilir; Bunun ötesinde, bu şekilde erişilen sıradan cihazlar gibi davranırlar.

NT nesne alanını keşfetmek için, temelde gezinmenizi sağlayan WinObj'u öneririm. \. \ bu ağaçta GLOBAL?? ile eşleştirilmiştir (aslında diğer bazı alanlar da vardır. Ağacın geri kalanı, Win32'ların tersine, sisteme ilişkin olarak NT'leriniz olmasını gerektirir).

Ve bilmediğiniz durumda, INVALID_HANDLE_VALUE0xffffff... olarak tanımlanmıştır - bu genellikle bir açık başarısız olduğunda oluşur.

İlgili konular