Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.17;
Скачать: CL | DM;

Вниз

Как узнать когда данные реально ушли из ком порта ?   Найти похожие ветки 

 
jack128 ©   (2003-02-20 14:47) [0]

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

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

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

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

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

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

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

отвечает.

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

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

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


 
Opuhshii ©   (2003-02-20 15:10) [1]

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


 
jack128 ©   (2003-02-20 15:29) [2]

Строго говоря не я, а компонент(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
) ;


 
крот ©   (2003-02-21 05:50) [3]

2jack128 © (20.02.03 14:47)

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



 
jack128 ©   (2003-02-21 21:19) [4]

Не знаю, не знаю...
У принимаю - передаю данные через оптоголовку, которая отражает сигналы из компьютера...
После такого кода
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;
Что делать? © Чернышевский



Страницы: 1 вся ветка

Текущий архив: 2003.04.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
14-54888
Palladin
2003-04-02 02:01
2003.04.17
Кто в muLisp силен? :(


14-54876
VID
2003-03-29 02:17
2003.04.17
Написание музыки из сэмплов.


1-54742
volph
2003-04-06 10:27
2003.04.17
Хранение текстовых данных как в Ini-файле, но


8-54771
alois
2003-01-02 22:37
2003.04.17
Проигрывание WMA-файлов в случайном порядке


6-54777
Bosh
2003-02-21 04:36
2003.04.17
RAS