簡體   English   中英

ReadFile 只讀取一個緩沖區字符?

[英]ReadFile only reading one buffer character?

我正在編寫一個程序,通過 USB 的虛擬 com 端口與電機驅動器進行通信。 我正在使用 windows.h 文件 io 與其通信(CreateFile、WriteFile、ReadFile)。 我可以完美地寫入驅動器,但是在嘗試讀取驅動器時遇到了問題。 出於某種原因, ReadFile 似乎只從緩沖區中讀取一個字符。 這是我的代碼:

#define READ_BUFF_SIZE 500
#define READ_TIMEOUT 5000
void ReadInput(HANDLE hComm)
{
    DWORD dwRead, dwRes;
    BOOL fWaitingOnRead = FALSE;
    OVERLAPPED osReader = {0};
    char lpBuf[READ_BUFF_SIZE] = {0};

    osReader.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
    if(osReader.hEvent==NULL){
        cerr<<"Error creating overlapped handle!";return;}

    if(!fWaitingOnRead){
        if(!ReadFile(hComm, lpBuf, READ_BUFF_SIZE, &dwRead, &osReader)){
            if(GetLastError()!=ERROR_IO_PENDING)
                {cout<<"Error: "<<GetLastError()<<endl;return;}
            else
                fWaitingOnRead = TRUE;
        }
        else {cout<<"a\n";PrintInput(lpBuf,dwRead);}
    }

    if(fWaitingOnRead){
        dwRes = WaitForSingleObject(osReader.hEvent,READ_TIMEOUT);
        cout<<"\n\nAfter WaitForSingleObject."<<endl;
        switch(dwRes)
        {
        case WAIT_OBJECT_0:
            if(!GetOverlappedResult(hComm,&osReader,&dwRead,TRUE))
                cout<<"Error in Comm"<<endl;
            else
                {cout<<"b\n\n";PrintInput(lpBuf,dwRead);}
            fWaitingOnRead = FALSE;
            break;

        case WAIT_TIMEOUT:
            cout<<"wait timeout"<<endl;
            break;

        default:
            cout<<"Default Case"<<endl;
            break;
        }

    }
}

dwRead 似乎總是設置為 1。我會得到驅動器輸出的第一個字符(撇號),但不會讀取其余的字符。 我發現了一些解決方法,如果我將其修改為僅期望一個字符,然后循環讀取,它將執行。
此外,我需要查詢驅動器以獲得響應,因此在調用這個 ReadInput 函數之前,我必須調用一個 WriteBuffer 來發送一個字符。 如果我在讀取和寫入調用之間設置延遲(~10-50 毫秒),它會讀取整個內容。

有人對此有任何想法嗎? 這不是一個大問題,因為我找到了一些解決方法,但過去幾天一直困擾着我。

編輯:澄清 tinman 的問題。

您需要使用適當的設置調用SetCommTimeouts 這是我使用的一些代碼。 您應該查看COMMTIMEOUTS結構的 MSDN 文檔。

// Only use read interval timeout. Do not use total read/write timeout.
COMMTIMEOUTS commtimeouts = { min((1000 + GetBaudrate() - 1) / GetBaudrate(), 1), 0, 0, 0, 0 };
SetCommTimeouts(m_hFile, &commtimeouts);

當然,您也可以提供總讀取超時而不是間隔超時。

來自MSDN :從通信設備讀取時, ReadFile的行為由設置的當前通信超時決定,並使用SetCommTimeoutsGetCommTimeouts函數檢索。 如果未能設置超時值,可能會出現不可預測的結果。 有關通信超時的更多信息,請參閱COMMTIMEOUTS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM