Здравствуйте, 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