Re[2]: Двойное срабатывание WaitCommEvent
От: _alecs Россия  
Дата: 19.02.08 18:29
Оценка:
Здравствуйте, CreatorCray, Вы писали, мы читали.

CC>Кинь код как ты ждешь event + код вокруг вызовов SetCommMask и SetCommTimeouts


Примерно это выглядит так (все проверки по созданию событий, открытию ком-порта, настройки ком-порта убранны):
...
// Инициализация.
DCB dcb;
HANDLE hCom;
HANDLE hBreakEvent;
OVERLAPPED oWait;
OVERLAPPED oRead;
COMMTIMEOUTS CommTimeouts;

ZeroMemory( &oWait, sizeof(oWait) );
ZeroMemory( &oRead, sizeof(oRead) );

// Создаём набор событий (default security attributes, manual-reset event, not signaled, no name).
hBreakEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
oWait.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
oRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

// ... проверки правильности созданий событий.

// Открываем ком-порт.
hCom = CreateFile( pComStr,
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,            /* no security attrs */
    OPEN_EXISTING,        /* comm devices must use OPEN_EXISTING */
    FILE_FLAG_OVERLAPPED,    /* overlapped I/O */
    NULL            /* hTemplate must be NULL for comm devices */
    );

// ... проверка правильности открытия порта.

// Настройка ком-порта.
GetCommState( hCom, &dcb );

// Fill in the DCB: baud=115200, 8 data bits, no parity, 1 stop bit.
dcb.BaudRate = 115200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;

SetCommState( hCom, &dcb );

// Настройка временных интервалов ком-порта.
GetCommTimeouts( hCom, &CommTimeouts ) ;

CommTimeouts.ReadIntervalTimeout = 1;
CommTimeouts.ReadTotalTimeoutMultiplier = MAXDWORD;
CommTimeouts.ReadTotalTimeoutConstant = MAXDWORD;

SetCommTimeouts( hCom, &CommTimeouts );

...
// Начинаем основной цикл приёма данных.
BYTE lpData[ 1024 ];
DWORD dwLength;

SetCommMask( hCom, EV_RXCHAR );

while( ! Terminated )
{
    // Ожидаем событие от ком-порта.

    if ( ! WaitCommEvent( hCom, dwEvtMask, &oWait ) )
    {
        if ( GetLastError() != ERROR_IO_PENDING )
        {
            // Прекращаем выполнение программы.
            // ...
        }

        // Ожидаем окончания операции.
        HANDLE hEvents[] = { oRead.hEvent, hBreakEvent };

        DWORD dwWait = WaitForMultipleObjects(
            sizeof( hEvents ) / sizeof( HANDLE ),    // number of object handles
            hEvents,                // pointer to an array of object handles
            FALSE,                    // returns when the state of any one of the objects is set to signaled
            dwMilliseconds);            // waits indefinitely

        switch( dwWait )
        {
            case WAIT_OBJECT_0:
                
                // Считываем данные с ком-порта (считываются все переданные данные, потерянных нет).
                // ...
                break;

            case WAIT_OBJECT_0 + 1: continue;

            default:
                // Прекращаем выполнение программы.
                // CancelIo( hCom ); ...
        }

} // end-while
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.