Страница 1 из 1

COM порт и отработка по прерыванию

Добавлено: 2010-10-22 14:09:13
mastertron
Не программист, но ... жизнь заставила. Пишу на Lazarus.
Стоит задача: на com (usb_to_com) висит аппаратный контроллер, большую часть времени молчит.
Что б отбирать минимальные ресурсы, мне хотелось бы написать резидентную ( не обязательно) программу, которая отрабатывала бы по прерыванию от порта, а не сканировала его периодически. Не знаю, как подползти к решению. Работа с com портами - нашел inout32.dll , описание есть, но как реагировать на прерывание? Или я не туда рулю? Может это в принципе уже не используется на NT/ХР... Подскажите чего нибудь, оптимальное решение, в какую сторону рулить.

Re: COM порт и отработка по прерыванию

Добавлено: 2010-10-25 20:35:51
Alex Keda
врятли тут найдутся спецы по этому языку...

Re: COM порт и отработка по прерыванию

Добавлено: 2011-01-06 22:50:09
dekloper
да не в языке дело
просто в нт все "резиденты" могут быть в виде службы, драйвера режима ядра.. либо вируса.. :)
ежели вы не дровописец, то врятли сможете контролировать прерывания порта прогой на каком то лазарусе в юзермоде..
а рулить - хук на исключение (структурное, векторное), но это уже ринг 0..

Re: COM порт и отработка по прерыванию

Добавлено: 2011-01-07 0:15:47
mastertron
Ну да, драйвера - не моё. Имел дело с программированием железа под DOS, но эт савсем другой уровень.
Искал вариант в общем виде подобно реакции на событие, к примеру - у многих компонент есть 'OnKeyPress' , в это событие вписываем код . Чего то подобного с буфером приемника порта наверняка предусмотрено или в каком нибудь компоненте или может ... просто незнаю :(
В принципе пока тестирую опросом по таймеру - ничё, працюет.
Не хочу "хорошо", хочу "идеально" :)

Re: COM порт и отработка по прерыванию

Добавлено: 2011-01-07 21:22:31
Dark_ASU
C++ and assembler юзайте.

Re: COM порт и отработка по прерыванию

Добавлено: 2011-01-10 12:32:27
BlackCat
mastertron, прерывания и прочие прелести прямого доступа к железу в WinNT с пользовательского уровня не доступны (легальным образом), да и не должно их быть там. А что бы обрабатывать данные по мере их поступления обратите внимание на т.н. асинхронный ввод-вывод.
=====
Каким именно образом вы проверяете наличие данных? Обычно, при попытке чтения из порта, если данных во внутреннем буфере драйвера нет, то поток исполнения блокируется до появления принятых данных.

Re: COM порт и отработка по прерыванию

Добавлено: 2011-01-27 15:13:39
iDimk0
Для дельфи3-7 есть компонета BComPort. Оч удобная , с демопроектами. Разобраться легко. В хелпе есть описание событий - например:

OnRxChar
В приемный буфер порта поступили данные

type TRxCharEvent = procedure(Sender: TObject; Count: Integer) of object;

property OnRxChar: TRxCharEvent;

Описание

Происходит при поступлении в приемный буфер порта как минимум одного байта данных от внешнего устройства. Count – количество поступивших байтов данных.
Кажись это вам надо. Под Lazarus бы её перекомпилить, но тот ругается, что поддеривает только статические.. и нужна версия LCL >= 1.0 Если получится - отпишитесь.

Re: COM порт и отработка по прерыванию

Добавлено: 2011-03-02 23:38:13
mastertron
Вобсчем, метода работы по аппаратному прерыванию не нашел. В принципе, создав отдельный поток и по таймеру читая файл компорта - вполне устроило.

Re: COM порт и отработка по прерыванию

Добавлено: 2011-03-02 23:56:46
BlackCat
mastertron писал(а):Вобсчем, метода работы по аппаратному прерыванию не нашел.
И не найдёте, для NT с пользовательского уровня.
mastertron писал(а):В принципе, создав отдельный поток и по таймеру читая файл компорта - вполне устроило.
Асинхронный ввод-вывод рассматривали в качестве альтернативы? Чтение по срабатыванию таймера чревато или отсутствием приемлемого времени реакции или чрезмерной загрузкой процессора.