Главная страница
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.017 c
14-54819
vic_vm
2003-03-28 15:04
2003.04.17
Поисковые сервера


14-54866
VEG
2003-04-01 23:00
2003.04.17
JPG -> TGA


14-54848
Neznaika
2003-04-01 13:43
2003.04.17
Прозрачный фон в RichEdite


3-54527
DAS
2003-03-31 11:57
2003.04.17
Импорт в Access из Visual FoxPro через ADO


1-54693
Mad Diger
2003-04-04 18:20
2003.04.17
TDbGridEh + keypress