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

Вниз

Чтение из ком порта.   Найти похожие ветки 

 
XTD ©   (2006-07-07 09:59) [0]

Люди, подскажите пожалуйста как прочитать данные из COM порта. Слышал что хорошо через класс TThread. Только как? (можно подробно ;-1)


 
XTD ©   (2006-07-07 10:11) [1]

Вот нашел:
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;

Как правильно создать класс и где обьявлять процедуру?


 
medved_68 ©   (2006-07-07 10:57) [2]

Что бы правильно прочесть из порта сначала надо его открыть и настроить. Здесь же я увидел  попытку что то прочитать из порта (Асинхронно). Может это у тебя в главной программе??? Иначе ошибка - неверный дискриптор при попытке
>  if not WaitCommEvent(hPort, dwMask, @OverRead) then


 
XTD ©   (2006-07-07 11:13) [3]

Да, порт уже открыт и hPort известна.


 
XTD ©   (2006-07-07 11:29) [4]

Как правильно создать класс и где обьявлять процедуру?


 
medved_68 ©   (2006-07-07 11:40) [5]

Понятно.

> Как правильно создать класс

В дельфях жмешь 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:53) [6]

Ок!
Списибо.



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

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

Наверх




Память: 0.48 MB
Время: 0.038 c
3-1148881795
DelphiN!
2006-05-29 09:49
2006.07.30
Очень медненный Append в таблицу Firebird-a


15-1151833354
kaif
2006-07-02 13:42
2006.07.30
Расшифрована структура энзима, вызывающего рак


1-1150732226
Dust
2006-06-19 19:50
2006.07.30
Определить размер буфера по указателю. Возможно?


2-1152621230
ddhvvn
2006-07-11 16:33
2006.07.30
Чтение шестнадцатиричных чисел


15-1151344759
Nic
2006-06-26 21:59
2006.07.30
Основные принципы прокладки кабеля Ethernet