Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.011 c
15-1151791564
TUser
2006-07-02 02:06
2006.07.30
Никто не поможет прогнать файл через ТеХ?


15-1151644517
DeadMeat
2006-06-30 09:15
2006.07.30
Степень двойки и тройки...


2-1152364745
KaLLeKa
2006-07-08 17:19
2006.07.30
Работа с потоками...


2-1152177215
!!!!!
2006-07-06 13:13
2006.07.30
Память


2-1152682196
Yegorchic
2006-07-12 09:29
2006.07.30
DLL и форма





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский