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

Вниз

и снова про COM порты   Найти похожие ветки 

 
TCrash ©   (2003-11-12 00:14) [0]

Сегодня искал здесь как работать с СОМ-портами и остановился на примере по адресу http://www.delphimaster.ru/articles/comport2/index.html
Пока что смущает одно - и я прекрасно понимаю почему так происходит. При запущенной процедуре опроса порта загрузка проца 100%.
Повторюсь, я прекрасно понимаю почему это так, но может кто посоветует, как изменить процедуру, чтобы не было такого "потрясающего" эффекта.

Я так полагаю, это вопрос скорее всего к автору проекта, но буду благодарен всем :-)


 
Talla2k ©   (2003-11-12 01:05) [1]

Там много ошибок!!!
Посылка chr($0)+chr($01) не будет выполнена!
Не совсем верная инициализация!!!
А загрузка у меня 2% !!!(но исходники на работе,извини)


 
TCrash ©   (2003-11-12 09:34) [2]

А можно на них взглянуть, если ты, конечно, уже на работе :-)


 
Digitman ©   (2003-11-12 15:26) [3]


> TCrash


там же ясно написано :

Процедура ReadComm
Теперь пристально рассмотрим процедуру ReadComm. Во-первых, это обычная процедура, входя состав модуля. Во-вторых, все ее содержимое зацикливается с помощью while true do. Но это не смертельно. Все-таки запускаем процедуру исключительно в отдельном потоке, так что беды не будет

т.е. "это не смертельно", когда цикл организован в доп.код.потоке. К тому же в момент выполнеия WaitCommEvent() код.поток "спит" и не требует временных ресурсов.

так что непонятно, откуда у тебя взялась 100%-я загрузка, если ты придерживаешься упомянутых в статье требований


 
y-soft ©   (2003-11-12 16:03) [4]

Не поленился и скачал пример. Очень много странностей :))

Например, порт открывается с флагом FILE_FLAG_OVERLAPPED, но процедуры ожидания событий, чтения и записи в порт написаны, как для синхронного ввода/вывода

Правильно делать примерно так (только принцип):

var
Overlapped : TOverlapped;
LastError, Evts, Dummy : DWORD;
begin
FillChar(Overlapped,SizeOf(Overlapped),0);
Overlapped.hEvent := CreateEvent(nil,True,False,nil);
if (Overlapped.hEvent = INVALID_HANDLE_VALUE) then
raise Exception.Create("Ошибка создания события");
try
Evts := 0;
if not WaitCommEvent(fCommHandle, Evts, Overlapped) then
begin
LastError := GetLastError;
if LastError = ERROR_IO_PENDING then
begin
if WaitForSingleObject(Overlapped.hEvent, INFINITE) =
WAIT_OBJECT_0 then
GetOverlappedResult(fCommHandle, Overlapped, Dummy, True)
else
raise Exception.Create("Ошибка WaitForSingleObject");
end
else
raise Exception.Create(SysErrorMessage(LastError));
end;
if Evts and EV_RXFLAG = EV_RXFLAG then
begin
if not ClearCommError(fComHandle,LastError,nil) then
raise Exception.Create("Ошибка ClearCommError");
//Далее аналогичным образом читаем из порта...
end;
finally
CloseHandle(Overlapped.hEvent);
end;



Если же перекрытый ввод/вывод не используется, то необходимо обязательно установить таймауты (это в любом случае не лишне)

ЗЫ Можно и не создавать явным образом Event в Overlapped, а в функции ожидания передавать описатель порта, но тогда будет вести себя очень странно в Win9X


 
y-soft ©   (2003-11-12 16:57) [5]

Sorry за опечатку, следует читать:


...
if not WaitCommEvent(fCommHandle, Evts, @Overlapped) then
...



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
1-93499
pASkdua
2004-01-16 18:14
2004.01.29
Как напечатат все содержимое SrcollBox-а?


3-93330
Ренат
2003-12-30 10:00
2004.01.29
AdoQuery parameters


3-93341
MagaSoft
2004-01-04 21:28
2004.01.29
Суммирование в БД Access


1-93546
Сережа
2004-01-17 23:31
2004.01.29
Таймер


1-93447
Незнайка
2004-01-16 12:49
2004.01.29
Как в дельфи перевести: