![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с СОМ-портом [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 порты?
Имхо,НЕТ.