Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.066 c
2-1210676889
Сергей
2008-05-13 15:08
2008.06.08
DBImage


2-1210942401
Шестаков Антон
2008-05-16 16:53
2008.06.08
Работа с TreeViev


6-1188144637
Max.66RUS
2007-08-26 20:10
2008.06.08
Отследить момент подключения компьютера к интернет...


15-1208888750
TIF
2008-04-22 22:25
2008.06.08
Всё, ухожу в прошлое... Всем пока


2-1211116922
Johnny
2008-05-18 17:22
2008.06.08
Добавить поле в Access





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский