[英]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
的行為由設置的當前通信超時決定,並使用SetCommTimeouts
和GetCommTimeouts
函數檢索。 如果未能設置超時值,可能會出現不可預測的結果。 有關通信超時的更多信息,請參閱COMMTIMEOUTS
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.