Текущий архив: 2008.06.08;
Скачать: CL | DM;
Вниз
WaitCommEvent (EV_TXEMPTY) Найти похожие ветки
← →
balepa © (2007-03-30 14:22) [0]Как правильно пользоваться этой функцией
Например если напишу так:
...
SetCommMask(hComm,EV_TXEMPTY);
...
WaitCommEvent(hComm,mask);
WriteFile(...);
в mask будет произошедшее событие потом надо проверять mask на EV_TXEMPTY и если это оно то WriteFile, или WaitCommEvent завершиться только при EV_TXEMPTY ?
Опишу что нужно сделать, может подскажете другое решение:
Два ПК соединены по Com порту, один принимает(ПК1) один передает(ПК2).
На ПК1 изменить ничего нельзя, а на ПК2 нужно сделать так чтобы он 256 байт отправлял по 32 байта т.е. 8 "посылок", чтобы эти "посылки" отправлялись по очереди:
1-ая посылка отправилась, оправляется вторая и т.д. Вот для этого хочу использовать WaitCommEvent на EV_TXEMPTY (как я понял это событие происходит когда последний байт начал передаваться из буфера).
Порт на ПК1 настроен так (Windows98, на ПК2 WinXP):
Com.TimeOut.ReadIntervalTimeout = MAXDWORD;
Com.TimeOut.ReadTotalTimeoutMultiplier = 0;
Com.TimeOut.ReadTotalTimeoutConstant = 0;
Com.TimeOut.WriteTotalTimeoutMultiplier = 0;
Com.TimeOut.WriteTotalTimeoutConstant = 0;
try
{
Com.Parametr.DCBlength = 0x1c;
Com.Parametr.BaudRate = speed;
Com.Parametr.fBinary = 1;
Com.Parametr.fParity = false; //None
Com.Parametr.fOutxCtsFlow = false; // CTS output flow control
Com.Parametr.fOutxDsrFlow = false; // DSR output flow control
Com.Parametr.fDtrControl = 1;//DTR_CONTROL_DISABLE; // DTR flow control type
Com.Parametr.fDsrSensitivity = false; // DSR sensitivity
Com.Parametr.fTXContinueOnXoff = false; // XOFF continues Tx
Com.Parametr.fOutX = false;
Com.Parametr.fInX = false;
Com.Parametr.fErrorChar = false;
Com.Parametr.fNull = false;
Com.Parametr.fRtsControl = 3; // RTS flow control
Com.Parametr.fAbortOnError = 1; // abort reads/writes on error
Com.Parametr.fDummy2 = false; // reserved
Com.Parametr.wReserved = 0; // not currently used
Com.Parametr.XonLim = 0xffff; // transmit XON threshold
Com.Parametr.XoffLim = 0xffff; // transmit XOFF threshold
Com.Parametr.ByteSize = 8;
Com.Parametr.Parity = paritet; // 0-4=no,odd,even,mark,space
Com.Parametr.StopBits = 0; //1.5
Com.Parametr.XonChar = NULL;
Com.Parametr.XoffChar = NULL;
Com.Parametr.ErrorChar = NULL;
Com.Parametr.EofChar = NULL;
Com.Parametr.EvtChar = NULL;
Com.Parametr.wReserved1 = 0;
Com.hFile = CreateFile(c,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OP EN_EXISTING,FILE_FLAG_OVERLAPPED|FILE_ATTRIBUTE_NORMAL,NULL);
SetCommTimeouts(Com.hFile,&Com.TimeOut);//установить таймауты
SetCommState(Com.hFile,&Com.Parametr);//настроить порт
}
← →
REA (2007-09-21 10:33) [1]>Например если напишу так:
>SetCommMask(hComm,EV_TXEMPTY);
>WaitCommEvent(hComm,mask);
>WriteFile(...);
То все повиснет. Можно так: Write - Wait, но шутка в том, что последний бит может уйти до того как вернется Write и тогда тоже повиснет. Поэтому есть смысл воспользоваться Overlapped режимом записи и ожидания и использовать waitforsingleobject. Правда в отдельных случаях события вызываются как то "не так". А именно может не сработать событие ухода последнего бита (хотя казалось бы куда ему деться). В этом случае вызывать WaitCommEvent повторно нельзя (или не имеет смысла - pending)
Еще почитайте тут
http://subscribe.ru/archive/comp.prog.visualc/200502/17155352.html
← →
guav © (2007-09-21 11:48) [2]При не-overlapped режиме WriteFile возвращает управление после передачи данных. При двух последовательных вызовах WriteFile последовательность передачи данных сохраняется.
> На ПК1 изменить ничего нельзя, а на ПК2 нужно сделать так
> чтобы он 256 байт отправлял по 32 байта т.е. 8 "посылок",
> чтобы эти "посылки" отправлялись по очереди
Если между послыками нет задержки, то 8 посылок по 32 байта это одна посылка 256 байт. Данные всё равно отправляются по одному байту.
Если ничего, кроме [0] не требуется, не вижу вообще смысла ни в WaitCommEvent ни в Overlapped для данного случая.
← →
REA (2007-09-21 12:08) [3]Наколько я понимаю EV_TXEMPTY указывает, когда ушел последний бит, а не байт.
>При не-overlapped режиме WriteFile возвращает управление после передачи данных
Я подозреваю управление возвращается после того как оно натолкает байты в очередь передатчика (последние).
← →
tesseract © (2007-09-25 10:15) [4]
> Я подозреваю управление возвращается после того как оно
> натолкает байты в очередь передатчика (последние).
Именно так. Возврат функции зависит от наполненности буфера порта.
← →
balepa © (2007-09-28 09:46) [5]Я уж и забыл что такое спрашивал. :)
> guav © (21.09.07 11:48) [2]
> Если между послыками нет задержки, то 8 посылок по 32 байта
> это одна посылка 256 байт. Данные всё равно отправляются
> по одному байту.
Это я осознал прочитав свой вопрос :)
Надо было передавать 8 посылок с интервалом между ними в 1 сек. т.е. 1-ая отправилась 1-ну секунду подождали 2-ую отправили и т.д.
> REA (21.09.07 10:33) [1]
За ссылочку спасибо.
> REA (21.09.07 12:08) [3]
> Наколько я понимаю EV_TXEMPTY указывает, когда ушел последний
> бит, а не байт.
EV_TXEMPTY The last character in the output buffer was sent
Character - это символ, а символ это как минимум байт.
Спасибо всем за участие.
Страницы: 1 вся ветка
Текущий архив: 2008.06.08;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.036 c