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

Вниз

Ожидание события порта открытого в режиме синхронного доступа   Найти похожие ветки 

 
Balkon   (2006-07-11 13:17) [0]

Здраствуйте.
Подскажите пожалуйста каким образом для порта, открытого в режиме синхронного доступа, ожидать событие EV_RXCHAR до истечения некоторого таймаута?

В синхронном режиме WaitCommEvent не возвращается до возникновения заданных событий и если, например, устройство от которого ожидается ответ молчит, то поток, в котором происходит все действо, останавливается.

Спасибо за внимание.


 
Reindeer Moss Eater ©   (2006-07-11 13:24) [1]

В синхронном режиме ничего ждать не надо.


 
Сергей М. ©   (2006-07-11 13:25) [2]


> В синхронном режиме WaitCommEvent не возвращается до возникновения
> заданных событий


Тебя кто-то заставляет использовать именно синхронный режим ?
WaitCommEvent не поддерживает в этом режиме на таймайты..


 
Reindeer Moss Eater ©   (2006-07-11 13:29) [3]

Тебя кто-то заставляет использовать именно синхронный режим ?

Например если работа с портом идет во вторичном потоке или в консоли, то синхронный режим ничем не хуже, а даже удобнее.


 
tesseract ©   (2006-07-11 13:30) [4]

> В синхронном режиме WaitCommEvent не возвращается до возникновения
> заданных событий и если, например, устройство от которого
> ожидается ответ молчит, то поток, в котором происходит все
> действо, останавливается.


WaitCommEvent вообще-то реагирует только после waitCommMask.

После него рекомендуется вызвать WaitForSingleObject;


 
medved_68 ©   (2006-07-11 13:34) [5]


> Подскажите пожалуйста каким образом для порта, открытого
> в режиме синхронного доступа, ожидать событие EV_RXCHAR
> до истечения некоторого таймаута?

Никаким.  Либо более точная установка  таймаута, либо OVERLAPPED. Вообще то вся эта лабуда и была придумана для асинхрона, что бы выяснить что там у нас с портом происходит.


 
Сергей М. ©   (2006-07-11 13:40) [6]


> Reindeer Moss Eater ©   (11.07.06 13:29) [3]


Не соглашусь.

В любом случае выбор режима д.б. осознан... А не от балды сделан ..


 
Balkon   (2006-07-11 13:41) [7]

Спасибо.

Работа с портом идет во вторичном потоке. Вот часть его кода:

 if WriteAKRComand then
   Try
     SetCommMask(FPortHandle,EV_RXCHAR);
     while (not Terminated) do
     begin
       WaitCommEvent(FPortHandle, Mask, nil);
       if Mask = EV_RXCHAR then
       begin
       ...

Протокол обмена с девайсом таков, что на каждую команду должен прийти ответ. Команды и ответы размером всего 12 байт, ответы приходят довольно быстро (доли секунды). Поэтому мне кажется ессно использовать синхронный режим. Однако, все хорошо до тех пор пока устройство есть на линии и отвечает. Если же ответа нет, то вторичный поток "висит" в ожидании события EV_RXCHAR. Как это исправить?


 
Reindeer Moss Eater ©   (2006-07-11 13:46) [8]

В любом случае выбор режима д.б. осознан... А не от балды сделан ..

С этим я согласен. Только мой вариант не от балды сделан.


 
Сергей М. ©   (2006-07-11 13:54) [9]


> Reindeer Moss Eater ©   (11.07.06 13:46) [8]


Надеюсь что так.


 
tesseract ©   (2006-07-11 13:55) [10]

> Если же ответа нет, то вторичный поток "висит" в ожидании
> события EV_RXCHAR. Как это исправить?

В твоём случае огород с WaitComEvent городить-то и не нужно. Достаточно открыть порт в режиме асинхронного доступа. Посылаем сигнал ждём ответа 200 мс - по моему опыту это максимальное время ответа девайса на команду.


 
Сергей М. ©   (2006-07-11 13:56) [11]


> Balkon   (11.07.06 13:41) [7]


> Как это исправить?


Никак, если файл не открыт в overlapped-режиме.


 
Balkon   (2006-07-11 14:09) [12]

> Никак, если файл не открыт в overlapped-режиме.
Спасибо! Это и требовалось доказать.


 
medved_68 ©   (2006-07-11 14:11) [13]


> Однако, все хорошо до тех пор пока устройство есть на линии
> и отвечает. Если же ответа нет, то вторичный поток "висит"
> в ожидании события EV_RXCHAR. Как это исправить?

Если девайс поддерживает DSR (готовность) то почему бы для начала не проверить этот сигнал на активность и только потом лезть в дебри

> события EV_RXCHAR.


 
Balkon   (2006-07-11 14:25) [14]

>Если девайс поддерживает DSR
Спасибо за совет, но не поддерживает (


 
Сергей М. ©   (2006-07-11 17:36) [15]


> Balkon


Предположим, у тебя есть возможность прервать работу блок.ф-ции WaitCommEvent() по таймауту.

Что дальше должно происходить при этом ?


 
tesseract ©   (2006-07-11 17:44) [16]

> Предположим, у тебя есть возможность прервать работу блок.ф-
> ции WaitCommEvent() по таймауту.


CancelIO поможет это сделать.

Опять- же почему не использовать отложенное чтение + GetOverlappedResult?
ИМХО для такого девайса (уж не весы ли? )  самое оно.


 
Balkon   (2006-07-12 06:48) [17]

Привет всем.

:) Если интересно. Девайс - автоматический компрессионный релаксометр (пресс для испытаний несущей способности грунтов) - весьма забавный прибор. К ПК подключенено до 30 шт. в послед через конвертер rs232 в rs485.

Написал управляющую программу с базой данных и отчетами использую для работы с портом компоненту CPortLib. Отлавливая различные глюки решил переписать работу с портом самостоятельно. Вот... разбираюсь.

К настоящему моменту переписал работу с портом в режиме асинхронного доступа. Несколько позже открою новую ветку где спрошу пару вопросов по реализации.


 
Сергей М. ©   (2006-07-12 08:23) [18]


> tesseract ©   (11.07.06 17:44) [16]
> CancelIO поможет это сделать


Не поможет.

Цитата из MSDN:

The CancelIo function cancels all pending input and output (I/O) operations that are issued by the calling thread for a specified file handle. The function does not cancel I/O operations that other threads issue for a file handle
...
Calling the CancelIo function with a file handle that is not opened with FILE_FLAG_OVERLAPPED does nothing.


 
tesseract ©   (2006-07-12 12:52) [19]


> Сергей М. ©   (12.07.06 08:23) [18]


Интересный факт - PortMon другого мнения :-)


 
Сергей М. ©   (2006-07-12 13:09) [20]


> tesseract ©   (12.07.06 12:52) [19]



> Интересный факт


Причем старый как мир Win9x)

А вот "новый мир" в виде Vista/LongHorn предлагает предлагает, кстати, CancelIOEx - тяпку, обрубающую в т.ч. и блокирующие операции

Опять же согласно MSDN - куда уж казалось бы более достоверного источника факта)


> PortMon другого мнения


И какого же ?


 
tesseract ©   (2006-07-12 18:25) [21]

>
> И какого же ?

Обрубает!!!!!

Ржать будешь, но обрубает!(Не WaitCommEvent само собой), но вот асинхронный вроде рубит.


 
Сергей М. ©   (2006-07-13 08:24) [22]


> tesseract ©   (12.07.06 18:25) [21]



> асинхронный вроде рубит


CancelIO как раз и предназначен для "обрубания" асинхронных операций ввода-вывода, выполняющихся в фоне.


> Не WaitCommEvent само собой


И не только WaitCommEvent - никакой блокирующий вызов не м.б. прерван с пом. CancelIO.

Не путай блокирующий вызов с незаконченной операцией ввода-вывода)


 
tesseract ©   (2006-07-13 10:00) [23]

WaitCommEvent - НЕ блокирующий.
после него надо ждать WaitForSingleobject;


 
Сергей М. ©   (2006-07-13 10:58) [24]


> tesseract ©   (13.07.06 10:00) [23]


Это за висит от режима открытия файла.

Цитата из справки:

If hFile handle was not opened with FILE_FLAG_OVERLAPPED, WaitCommEvent does not return until one of the specified events or an error occurs.



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

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

Наверх




Память: 0.53 MB
Время: 0.136 c
6-1152178987
Sleepeer
2006-07-06 13:43
2006.11.26
Решение проблем с PROXY аля как подключиться


15-1162825312
daser
2006-11-06 18:01
2006.11.26
Каковы минимальные требования для компа, чтоб работать


2-1162995132
doctor
2006-11-08 17:12
2006.11.26
TADOConnection.ConnectionString - редактирование


4-1152609432
Balkon
2006-07-11 13:17
2006.11.26
Ожидание события порта открытого в режиме синхронного доступа


2-1163061812
yyy111
2006-11-09 11:43
2006.11.26
for i := ...