2012-08-02 11 views
6

Używam portu COM w C++. Nie mogę otworzyć porty COM z większą liczbą niż 9, na przykład 10. Ta funkcja służy do wykrywania portu COM:Otwórz port COM w C++ z numerem wyższym niż 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; 

} 

Nie mogę zrozumieć, dlaczego na przykład COM10, rzuca FFFFFFFF z powrotem do obsługi hPort.

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

COM9, COM8, COM7 itp działa dobrze,

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

to istnieje rozwiązanie tego problemu?

+2

Nawiasem mówiąc, jest to skomplikowany sposób wykrywania portów szeregowych. W rejestrze systemu Windows znajduje się klucz HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ SERIALCOMM dla portów szeregowych dostępnych w systemie. – pmed

Odpowiedz

16

Jest to błąd, a rozdzielczość jest użyć ciągu

\\.\COM10 

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

sprawdzić this artykuł.

+0

Naprawiłem odpowiedź – Jeeva

+0

Świetna L "\\\\. \\ COM" działa! Dzięki :) – Jaro

+0

Nie rozumiem. Czy muszę skompilować z Unikodem? – Anonymous

7

Musisz użyć następującego formatu dla portów COM większych niż 9:

\\\\.\\COM%d 

Gdzie %d jest printf podstawienie dla numeru portu.

Dlaczego? Cóż, ten dostęp do globalnej przestrzeni obiektów NT, w której przechowywane są wszystkie obiekty. Windows zna alias COM0-9 w sposób, w jaki używasz go do obsługi DOS; poza tym działają jak zwykłe urządzenia, do których dostęp można uzyskać w ten sposób. Aby poznać przestrzeń obiektów NT, polecam WinObj, która zasadniczo pozwala przeglądać. \. \ jest odwzorowane na GLOBAL?? w tym drzewie (podobnie jak inne rejony, reszta drzewa wymaga posiadania NT, w przeciwieństwie do Win32, widoku systemu).

I na wszelki wypadek, jeśli nie wiesz, INVALID_HANDLE_VALUE jest zdefiniowany jako 0xffffff... - zwykle ma to miejsce, gdy nie uda się otworzyć.