Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с СОМ-портом [D6]


SergP. ©   (2004-09-19 09:40:00) 

Открываю порт как файл, а далее работаю с ним используя
WriteFile и ReadFile. Оно работает, но есть такая проблема: допустим девайс подключенный к COM порту посылает компу некоторые данные, прога должна принять их и обработать. Как это можно сделать? Делать отдельный Thread и там постоянно проверять не поступили ли данные с девайса, или есть методы попроще?

И вообще можно ли как-нить использовать для этих целей IRQ на которых "висят" соответствующие COM порты?

ЗЫ Если что не так написал - ногами не бейте, а помогите.


Erik1   (2004-09-20 10:44:00) [1]

Вобщето есть возможность работы в асинхроном режиме (overlapped) Пример:
function TCustomComm.WaitRead(var Buf: String): Integer;
var
 Overlapped: TOverlapped;
begin
 FillChar(Overlapped, Sizeof(Overlapped), 0);
 Overlapped.hEvent := FEvent.Handle;

 SetLength(Buf, ReadBufSize);
 ReadFile(FHandle, PChar(Buf)^, ReadBufSize, DWord(Result), @Overlapped); // аиснхроное чтение
 GetOverlappedResult(FHandle, Overlapped, DWord(Result), True); //ральное чтение с ожиданием, в случии False без ожидания
 FEvent.ResetEvent; //это для треда
 SetLength(Buf, Result);
end;


SergP.   (2004-09-20 09:00:00) [2]


>  [7] MBo ©   (20.09.04 08:45)
> >Поток постоянно опрашивает пока не появятся данные
> Нет, не так. При использовании Wait-функций ([6]) поток
> будет "спать", не крутясь понапрасну.


Спасибо. Вы меня успокоили...


MBo   (2004-09-20 08:45:00) [3]

>Поток постоянно опрашивает пока не появятся данные
Нет, не так. При использовании Wait-функций ([6]) поток будет "спать", не крутясь понапрасну.


Evgeny V   (2004-09-20 07:34:00) [4]

Смотри SetCommMask и WaitCommEvent


SergP.   (2004-09-20 01:43:00) [5]


>  [4] DiamondShark ©   (19.09.04 21:27)


Поток постоянно опрашивает пока не появятся данные, а при обработке аппаратного прерывания процедура(функция) сработает только когда эти данные появятся. ИМХО разница все-таки есть: тупой цикл ожидания и процедура срабатывающая только в нужный момент...


DiamondShark   (2004-09-19 21:27:00) [6]


> Неужели Винда не предусматривает возможности чтобы приложения
> могли использовать аппаратные прерыввания? Видимо Билли
> что-то здесь недоработал....

У тебя поток, ждущий ввода с порта, стоит, пока не появятся данные. Какая разница, кто запустит поток -- аппаратное прерывание или диспетчер потоков?


SergP.   (2004-09-19 16:56:00) [7]

Сделал используя Thread. Работает, вроде бы и кода для этого понадобилось совсем немного, но все равно мне это что-то не нравится, т.е. сам принцип постоянного опроса в дополнительном потоке не нравится. Неужели Винда не предусматривает возможности чтобы приложения могли использовать аппаратные прерыввания? Видимо Билли что-то здесь недоработал....


SergP.   (2004-09-19 15:05:00) [8]


> Если Вы прочли хоть одну статью,то наверно видели,что существует
> такое понятие как маска.Более того,случаев для установок
> этих масок более чем предостаточно.


Если Вас не затруднит, на всякий случай киньте пару линков на такие статьи...


GanibalLector   (2004-09-19 11:53:00) [9]

с Thread самое разумное решение.Есть конечно и проще(без использования Thread)но,это хуже.

Если Вы прочли хоть одну статью,то наверно видели,что существует такое понятие как маска.Более того,случаев для установок этих масок более чем предостаточно.

И вообще можно ли как-нить использовать для этих целей IRQ на которых "висят" соответствующие COM порты?
Имхо,НЕТ.


Наверх

Титульная страница Поиск, карта сайта Написать письмо