2012-08-02 5 views
6

Sto utilizzando una porta COM in C++. Non posso aprire porte COM con un numero superiore a 9, per esempio 10. Questa funzione è utilizzato per il rilevamento della porta COM:Aprire una porta COM in C++ con un numero più alto di 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; 

} 

non riesco a capire perché ad esempio COM10, getta FFFFFFFF ritorna MANIGLIA hPort.

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

COM9, COM8, COM7, ecc funziona bene,

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

E c'è una soluzione per questo problema?

+2

A proposito, è un modo complicato per il rilevamento delle porte seriali. C'è una chiave HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ SERIALCOMM nel registro di Windows per le porte seriali disponibili nel sistema. – pmed

risposta

16

Si tratta di un bug e la risoluzione è quello di utilizzare la stringa

\\.\COM10 

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

controllo this articolo.

+0

Ho risolto la risposta – Jeeva

+0

Great L "\\\\. \\ COM" funziona! Grazie :) – Jaro

+0

Non capisco. Devo compilare con unicode? – Anonymous

7

è necessario utilizzare il seguente formato per porte COM superiori a 9:

\\\\.\\COM%d 

Dove %d è un printf sostituzione per il numero di porta.

Perché? Bene, questo accede allo spazio oggetti NT globale, in cui sono memorizzati tutti gli oggetti. Solo Windows conosce l'alias COM0-9 nel modo in cui lo stai usando per il supporto DOS; oltre a ciò, agiscono come normali dispositivi, a cui si accede in questo modo.

Per esplorare lo spazio oggetti NT, si consiglia di WinObj che fondamentalmente consente di esplorare. \. \ è mappato a GLOBAL?? in questo albero (come altre aree, in realtà. Il resto dell'albero richiede che NT abbia, al posto di Win32, la vista del sistema).

E nel caso non lo sapessi, INVALID_HANDLE_VALUE è definito come 0xffffff... - questo di solito si verifica quando un open fallisce.

Problemi correlati