Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать когда данные реально ушли из ком порта ? [D5, Win95/98, WinME, Win2k]


jack128 ©   (2003-02-20 14:47:00) 

Добрый день :
Есть устройство, подключенное к ком порту, запросы которому нужно посылать на скорости 300

бод, а ответ считывать на скорости 1200 бод. После того, как я посылаю

запрос(WriteFile(...))( синхронно ), я меняю скорость порта на 1200(SetCommState(...)),
но устройсво не отвечает, а вот если я после записи в порт поставлю задержку(Sleep(...)), и

только потом изменю скорость то все в порядке...

По этому и еще по ряду признаков я сделал вывод, что WriteFile возвращает управление до того

, как данные реально уйдут с порта на внешнее устройство, видимо данные пишутся в какой то

внутренний буфер... Следовательно я посылаю запрос на скорости 1200, поэтому устройство и не

отвечает.

SetCommMask + WaiCommEvent делают, по всей видимости, тоже самое(возвращают управление после

того, как данные были отправленны в буфер)

Отсюда вопрос : как узнать когда данные реально ушли из порта во внешнее устройство?


jack128   (2003-02-21 21:19:00) [1]

Не знаю, не знаю...
У принимаю - передаю данные через оптоголовку, которая отражает сигналы из компьютера...
После такого кода
var query : string; // запрос устройству
begin
query :=....;
port.baudrate := br300;
Port.SendString(Query);
Port.BaudRate := br1200;
....
end;
я читаю отраженный запрос,
НО ЭТОГО НЕ МОЖЕТ БЫТЬ - запрос то отправлен на скорости 300 бод
а читаю я порт на скорости 1200 бод... следовательно данные отправлены на скорости 1200 бод
если я использую WaitCommEvent
var ev : cardinal

query :=....;
port.baudrate := br300;
Port.SendString(Query);
if SetCommMask(Port.Handle, EV_TXEMPTY ) then begin
WaitCommEvent(Port.Handle,ev,nil);здесь прога виснет
Port.BaudRate := br1200;
Что делать? © Чернышевский


крот   (2003-02-21 05:50:00) [2]

2jack128 © (20.02.03 14:47)

Если верить MSDN, то функция WaitCommEvent с параметром EV_TXEMPTY вернет управление, когда выходной буффер будет пуст, то есть данные реально уйдут устройству.


jack128   (2003-02-20 15:29:00) [3]

Строго говоря не я, а компонент(TCommPortDriver)

FHandle := CreateFile( pchar(FPortName),
GENERIC_READ or GENERIC_WRITE,
0, // Not shared
nil, // No security attributes
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0 // No template
) ;


Opuhshii   (2003-02-20 15:10:00) [4]

а как вы создаете файл?


Наверх

Титульная страница Поиск, карта сайта Написать письмо