9

C++ で COM ポートを使用しています。10 など、9 より大きい数の COM ポートを開くことができません。これは、COM ポートの検出に使用される関数です。

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;

}

たとえば、COM10 が FFFFFFFF を HANDLE hPort にスローする理由がわかりません。

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

COM9、COM8、COM7 などは正常に動作し、

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

この問題の解決策はありますか?

4

2 に答える 2

23

これはバグであり、解決策は文字列を使用することです

\\.\COM10

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

この記事をチェックしてください。

于 2012-08-02T10:04:59.223 に答える
9

9 以上の COM ポートには、次の形式を使用する必要があります。

\\\\.\\COM%d

%dポート番号の printf 置換はどこにありますか。

なんで?これは、すべてのオブジェクトが格納されているグローバルな NT オブジェクト スペースにアクセスします。Windows は、DOS サポートに使用している方法で COM0-9 をエイリアスすることしか認識していません。それ以上は、この方法でアクセスされる通常のデバイスのように動作します。

NT オブジェクト スペースを探索するには、基本的にブラウズできるWinObjをお勧めします。\.\ はGLOBAL??、このツリーにマップされます (実際には、他のいくつかの領域と同様です。ツリーの残りの部分では、Win32 ではなく NT のシステム ビューが必要です)。

ご存じないかもしれませんが、INVALID_HANDLE_VALUEは次のように定義されて0xffffff...います。これは通常、オープンに失敗したときに発生します。

于 2012-08-02T10:04:38.520 に答える