ReadFile только чтение одного буферного символа? - PullRequest
1 голос
/ 05 августа 2011

Я пишу программу для связи с моторным приводом через виртуальный 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 мс) между вызовами чтения и записи, она прочитает все.

У кого-нибудь есть идеи по этому поводу? Это не большая проблема, так как я нашел некоторые обходные пути, но это беспокоило меня в течение последних нескольких дней.

Редактировать: Разъяснение вопросов оловянника.

1 Ответ

3 голосов
/ 04 ноября 2011

Вам необходимо вызвать SetCommTimeouts с соответствующими настройками.Вот код, который я использую.Вы должны посмотреть документацию MSDN для структуры COMMTIMEOUTS.

// 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.

...