2012-08-02 15 views
6

Estoy usando un puerto COM en C++. No puedo abrir los puertos COM con un número superior a 9, por ejemplo 10. Esta función se utiliza para la detección de puerto COM:Abra un puerto COM en C++ con el número más alto que 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; 

} 

No puedo entender por qué, por ejemplo, COM10, lanza de nuevo a FFFFFFFF MANIPULAR hPort.

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

COM9, COM8, COM7, etc funciona bien,

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

Es Hay una solución para este problema?

+2

Por cierto, es una forma complicada de detectar puertos serie. Hay una clave HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ SERIALCOMM en el Registro de Windows para los puertos serie disponibles en el sistema. – pmed

Respuesta

16

Es un error y la resolución es el uso de la cadena

\\.\COM10 

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

cheque this artículo.

+0

He solucionado la respuesta – Jeeva

+0

¡Excelente L "\\\\. \\ COM" funciona! Gracias :) – Jaro

+0

No lo entiendo. ¿Tengo que compilar con Unicode? – Anonymous

7

Es necesario utilizar el siguiente formato para puertos COM superiores a 9:

\\\\.\\COM%d 

Dónde %d printf es una sustitución para el número de puerto.

¿Por qué? Bueno, esto accede al espacio de objetos NT global, donde se almacenan todos los objetos. Windows solo sabe alias COM0-9 de la manera que lo está usando para soporte de DOS; más allá de eso, actúan como dispositivos ordinarios, a los que se accede de esta manera.

Para explorar el espacio de objetos NT, recomiendo WinObj, que básicamente le permite navegar. \. \ se asigna a GLOBAL?? en este árbol (al igual que en otras áreas, en realidad. El resto del árbol requiere que tenga una vista NT del sistema, a diferencia de Win32).

Y en caso de que no lo supiera, INVALID_HANDLE_VALUE se define como 0xffffff... - esto generalmente ocurre cuando falla una apertura.

Cuestiones relacionadas