![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение из ком порта. [D7, 2000]
XTD © (2006-07-07 09:59:00)Люди, подскажите пожалуйста как прочитать данные из COM порта. Слышал что хорошо через класс TThread. Только как? (можно подробно ;-1)
XTD (2006-07-07 11:53:00) [1]Ок!
Списибо.
medved_68 (2006-07-07 11:40:00) [2]Понятно.
> Как правильно создать класс
В дельфях жмешь File->New->Other->Thread Object. Попросит названия. Назови как нибудь. А затем все вышеприведенную лабуду запихни туда. Только в главной проге добавь после открытия и настройки порта:
твой поток:=Имя класса которым ты обозвал поток.Create(False);
и он запустится на выполнение начнет отслеживать WaitForSingleObject(OverRead.hEvent, INFINITE) т.е ждать когда произойдет изменение заданное твоей маской dwMask, которую тоже надо бы установить(А может ты и это сделал).
> if not ClearCommError(hPort, dwError, @ComStat) then
> raise Exception.Create('Error clearing port');
Далее он очищает возникшую ошибку (Тоже непонятно, зачем????) если
WaitForSingleObject будет ждать маску "вечно", и только потом дело дойдет до чтива из порта. При этом при любых ошибках поток будет вылетать через
raise Exception в главную прогу. Лучше все это барахло обрабатывать в потоке. В общем код какой то незавершенный. В принципе что дал......
> где обьявлять процедуру?
В главной проге в разделе var объявляешь имя потока:класс каким ты его назвал.
XTD (2006-07-07 11:29:00) [3]Как правильно создать класс и где обьявлять процедуру?
XTD (2006-07-07 11:13:00) [4]Да, порт уже открыт и hPort известна.
medved_68 (2006-07-07 10:57:00) [5]Что бы правильно прочесть из порта сначала надо его открыть и настроить. Здесь же я увидел попытку что то прочитать из порта (Асинхронно). Может это у тебя в главной программе??? Иначе ошибка - неверный дискриптор при попытке
> if not WaitCommEvent(hPort, dwMask, @OverRead) then
XTD (2006-07-07 10:11:00) [6]Вот нашел:
procedure TReadThread.Execute;
var
ComStat: TComStat;
dwMask, dwError: DWORD;
OverRead: TOverlapped;
Buf: array[0..$FF] of Byte;
dwRead: DWORD;
begin
OverRead.hEvent := CreateEvent(nil, True, False, nil);
if OverRead.hEvent = Null then
raise Exception.Create('Error creating read event');
FreeOnTerminate := True;
while not Terminated do
begin
if not WaitCommEvent(hPort, dwMask, @OverRead) then
begin
if GetLastError = ERROR_IO_PENDING then
WaitForSingleObject(OverRead.hEvent, INFINITE)
else
raise Exception.Create('Error waiting port event');
end;
if not ClearCommError(hPort, dwError, @ComStat) then
raise Exception.Create('Error clearing port');
dwRead := ComStat.cbInQue;
if dwRead > 0 then
begin
if not ReadFile(hPort, Buf, dwRead, dwRead, @OverRead) then
raise Exception.Create('Error reading port');
// Buf
end;
end; {while}
end;
Как правильно создать класс и где обьявлять процедуру?