2012-08-02 3 views
6

Ich verwende einen COM-Port in C++. Ich kann nicht COM-Ports mit einer höheren Zahl als 9, zum Beispiel 10. Dies ist Funktion für COM-Port-Erkennung öffnen:Öffnen Sie einen COM-Port in C++ mit einer höheren Nummer als 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; 

} 

Ich kann nicht verstehen, warum zum Beispiel COM10, wirft FFFFFFFF zurück hPort zu handhaben.

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

COM9, COM8, COM7 usw. funktioniert gut,

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

Es gibt eine Lösung für dieses Problem?

+2

Übrigens ist es eine komplizierte Art der Erkennung von seriellen Ports. Es gibt einen Schlüssel HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ SERIALCOMM in der Windows-Registrierung für serielle Ports, die im System verfügbar sind. – pmed

Antwort

16

Es ist ein Fehler, und die Auflösung ist die Zeichenfolge

\\.\COM10 

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

Scheck this Artikel zu verwenden.

+0

Ich reparierte die Antwort – Jeeva

+0

Great L "\\\\. \\ COM" funktioniert! Danke :) – Jaro

+0

Nicht bekommen. Muss ich mit Unicode kompilieren? – Anonymous

7

Sie müssen das folgende Format für COM-Ports größer als 9 verwenden:

\\\\.\\COM%d 

Wo %d ist eine printf-Substitution für die Portnummer.

Warum? Nun greift dies auf den globalen NT-Objektbereich zu, wo alle Objekte gespeichert sind. Windows kann COM0-9 nur so aliasnieren, wie Sie es für die DOS-Unterstützung verwenden. darüber hinaus verhalten sie sich wie gewöhnliche Geräte, auf die auf diese Weise zugegriffen wird.

Um den NT-Objektraum zu erkunden, empfehle ich WinObj, die Sie im Grunde um durchsuchen können. \. \ wird in diesem Baum auf GLOBAL?? gemappt (wie auch einige andere Bereiche tatsächlich. Der Rest der Struktur erfordert NTs, im Gegensatz zu Win32, Ansicht des Systems).

Und nur für den Fall, dass Sie nicht wissen, INVALID_HANDLE_VALUE ist als 0xffffff... definiert - dies tritt normalerweise auf, wenn ein Öffnen fehlschlägt.