4

C++ を使用して読み取りおよび書き込み用の COM ポートを開こうとしていますが、実際に開く最初の段階を通過できないようです。でINVALID_HANDLE_VALUEハンドルを握りGetLastError FILE_NOT_FOUNDます。私は数日間ウェブを検索しましたが、アイデアがありません。この Web サイトでも、COM に関するすべての質問を検索しました。

ポートの名前を正しく取得するために、既存のポートをスキャンしました(またはそう信じています)。

_T("COM1")スラッシュあり、スラッシュなし、コロンあり、コロンなし、_Tなしの組み合わせも試しました

私は64ビットマシンでWindows 7を使用しています。

これは私が得たコードです

これに関するご意見をお待ちしております

void SendToCom(char* data, int len)
{

DWORD cbNeeded = 0;
DWORD dwPorts = 0;
EnumPorts(NULL, 1, NULL, 0, &cbNeeded, &dwPorts);

//What will be the return value
BOOL bSuccess = FALSE;

LPCSTR COM1 ;

BYTE* pPorts = static_cast<BYTE*>(malloc(cbNeeded));
bSuccess = EnumPorts(NULL, 1, pPorts, cbNeeded, &cbNeeded, &dwPorts);
if (bSuccess){
    PORT_INFO_1* pPortInfo = reinterpret_cast<PORT_INFO_1*>(pPorts);
    for (DWORD i=0; i<dwPorts; i++)
    {
        //If it looks like "COMX" then          
        size_t nLen = _tcslen(pPortInfo->pName);
        if (nLen > 3)
        {
            if ((_tcsnicmp(pPortInfo->pName, _T("COM"), 3) == 0) ){
                COM1 =pPortInfo->pName;
                //COM1 ="\\\\.\\COM1";
                HANDLE m_hCommPort = CreateFile( COM1 ,
                    GENERIC_READ|GENERIC_WRITE,  // access ( read and write)
                    0,                           // (share) 0:cannot share the COM port
                    NULL,                           // security  (None)
                    OPEN_EXISTING,               // creation : open_existing
                    FILE_FLAG_OVERLAPPED,        // we want overlapped operation
                    NULL                            // no templates file for COM port...
                    );
                if (m_hCommPort==INVALID_HANDLE_VALUE)
                {
                    DWORD err = GetLastError();
                    if (err == ERROR_FILE_NOT_FOUND) {
                        MessageBox(hWnd,"ERROR_FILE_NOT_FOUND",NULL,MB_ABORTRETRYIGNORE);
                    }
                    else
                        if(err == ERROR_INVALID_NAME) {
                            MessageBox(hWnd,"ERROR_INVALID_NAME",NULL,MB_ABORTRETRYIGNORE);
                        }
                        else
                        {
                            MessageBox(hWnd,"unkown error",NULL,MB_ABORTRETRYIGNORE);
                        }
                }
                else{
                    WriteAndReadPort(m_hCommPort,data);
                }
            }
            pPortInfo++;
        }
    }
 }

}
4

3 に答える 3

0

Windows 10 を使用している場合は、すべてのシステム アップデートを実行すると役立つ場合があります。

ポート「COM4」を開くとエラーERROR_FILE_NOT_FOUNDが返されるという同じ問題がありました。プログラムを「管理者」として実行すると、機能しました。1511 にアップデートした後、プログラムは「管理者」として実行していなくても「COM4」を開くことができます。

于 2016-10-19T14:32:50.880 に答える