Тема: COM порт
Показать сообщение отдельно
  #9  
Старый 13.02.2015, 00:45
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Хотел написать про WaitForSingleObject, а написал WaitCommEvent.
Не помню где брал, но у меня работает.
Код:
function ReadThread(P : Pointer) : DWORD; stdcall;
var
  asp    : TAsyncPort;
  cs     : COMSTAT;						                // структура текущего состояния
								                //  порта, в данной программе
								                //  используется для определения
								                //  количества принятых в порт байтов
  btr,
  Temp,
  Mask,
  Signal : DWORD;						                // переменная temp используется в
							                        //  качестве заглушки
begin
  asp := TAsyncPort(P);

  rdo.hEvent := CreateEvent(NIL, True, True, NIL);		                // создать сигнальный объект-событие
								                //  для асинхронных операций
  SetCommMask(asp.fCom, EV_RXCHAR);				                // установить маску на срабатывание
								                //  по событию приёма байта в порт
  while True do							                // пока поток не будет прерван,
								                //  выполняем цикл
  begin
    WaitCommEvent(asp.fCom, Mask, @rdo);			                // ожидать события приёма байта
								                //  (это и есть перекрываемая операция)
    Signal := WaitForSingleObject(rdo.hEvent, INFINITE);	                // приостановить поток до прихода байта
    if Signal = WAIT_OBJECT_0 then				                // если событие прихода байта произошло
    begin
      if GetOverlappedResult(asp.fCom, rdo, Temp, True) then	                // проверяем, успешно ли завершилась
								                //  перекрываемая операция WaitCommEvent
        if (mask and EV_RXCHAR) <> 0 then			                // если произошло именно событие
								                //  прихода байта
        begin
          ClearCommError(asp.fCom, Temp, @cs);			                // нужно заполнить структуру COMSTAT
          btr := cs.cbInQue;					                //  и получить из неё количество принятых байтов
          if btr > 0 then 					                // если действительно есть байты для чтения
          begin
            ReadFile(asp.fCom, BufRd[0], btr, Temp, @rdo);	        // прочитать байты из порта в буфер программы
          end;
        end;
    end;
  end;
end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием