Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.022 c
15-1209039762
ekto
2008-04-24 16:22
2008.06.08
как скрыть логин/пароль БД?


8-1180962851
Igor_thief
2007-06-04 17:14
2008.06.08
Screenshot формы (с рамкой)


2-1210838406
tytus
2008-05-15 12:00
2008.06.08
как в SendMessage передать строку?


3-1199809422
Slimer
2008-01-08 19:23
2008.06.08
Zeos & MySQL 4.1+


2-1211030172
focor
2008-05-17 17:16
2008.06.08
ASCII коды символов