Я пишу программу для связи с моторным приводом через виртуальный com-порт через USB. Я использую файл 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 мс) между вызовами чтения и записи, она прочитает все.
У кого-нибудь есть идеи по этому поводу? Это не большая проблема, так как я нашел некоторые обходные пути, но это беспокоило меня в течение последних нескольких дней.
Редактировать: Разъяснение вопросов оловянника.