Форум: "Система";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
ВнизКак узнать когда данные реально ушли из ком порта ? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c