Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.008 c
14-54814
Nikolai_S
2003-03-29 11:59
2003.04.17
Создание ссылки на веб-сайт в справке


1-54642
sidorov_al
2003-04-08 11:17
2003.04.17
Как положить ProgressBar на StatusBar


3-54534
GavAl
2003-04-01 09:26
2003.04.17
Как в уже созданой таблице добавить поле программно


8-54766
_noname_
2003-01-11 12:21
2003.04.17
OpenGL


3-54517
Сергей
2003-03-31 16:40
2003.04.17
DBGrid и выделение...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский