Port COM

0

Mam problemy z odczytem z portu.

  1. Jak ustawię przedostatni parametr funkcji CreateFile na FILE_FLAG_OVERLAPPED to czyta mi dwa razy to samo
  2. Jeżeli zaś ustawię przedostatni parametr funkcji CreateFile na 0 to po wywołaniu funkcji ClosePort program nadal czeka w linii WaitForMultipleObjects(...
var
    FHPort: THandle;
    FDCB: _DCB;
    FOverlapped: TOverlapped;
    FPort: String;
    FStoped: Boolean;
    FStopEvent: THandle;

function OpenPort : boolean;
begin
  FHPort := CreateFile(PChar('\\.\' + FPort),GENERIC_READ,0,
    nil,OPEN_EXISTING,0,0);
  GetCommState(FHPort,FDCB);
  FDCB.Parity:= NOPARITY;
  FDCB.BaudRate := CBR_2400;
  FDCB.XonLim:= 1024;
  FDCB.XoffLim:= 1024;
  FDCB.wReserved:= 0;
  FDCB.ByteSize:= 8;
  FDCB.StopBits:= 1;
  FDCB.Flags := $00000001;

  if not SetCommState(FHPort,FDCB) then
    Result := false
  else
    Result := true;
end;

procedure TDataBuforThread.Execute;
var
  EventHandles: array[0..1] of THandle;
  Mask, BytesTrans, Signaled : DWORD;
  Buffer : TComBufor;
begin
  if OpenPort = True then
  begin
    FStopEvent := CreateEvent(nil, True, False, nil);
    SetCommMask(FHPort, EV_RXCHAR or EV_BREAK);
    
    FillChar(FOverlapped, SizeOf(Overlapped), 0);
    FOverlapped.hEvent := CreateEvent(nil, True, True, nil);
    EventHandles[0] := FStopEvent;
    EventHandles[1] := FOverlapped.hEvent;
    repeat
      WaitCommEvent(FHPort, Mask, @FOverlapped);
      Signaled := WaitForMultipleObjects(2, @EventHandles, False, INFINITE);

      if not FStoped then
      begin
        if (Signaled = WAIT_OBJECT_0 + 1)
          and GetOverlappedResult(FHPort, FOverlapped, BytesTrans, False)
        then
          ReadFile(FHPort, Buffer, FBuforCount, BytesTrans, @FOverlapped);      end;

    until FStoped <> False;
    ClosePort;
    FDataBufor.Free;
  end;
end;

procedure ClosePort;
begin
  SetCommMask(FHPort, 0);
  PurgeComm(FHPort, PURGE_TXCLEAR or PURGE_RXCLEAR);
  CloseHandle(FHPort);
  CloseHandle(FOverlapped.hEvent);
  CloseHandle(FStopEvent);
end;

Nie wiem jak to rozwiązać. Gdzie pomylilem błąd?

0

ad2)
Dokładnie to zatrzymuje się w pierwszej linii funkcji ClosePort.

0

a co to jest ?

  SetCommMask(FHPort, 0); 

W drugim parametrze ma byc wskaznik do struktury (a jest zero czyli miejsce w pamieci o adresie 0)

wiec powinno byc w open

 GetCommState(FHPort,oldstat) ; //w klasie watku oldstat
 if not SetCommState(FHPort,FDCB) then
    Result := false
  else
    Result := true;

//i teraz w close
 SetCommState(FHPort,oldstat) ;
0

A co to jest oldstat?
Nie wiesz dlaczego czyta mi port podwojnie jak ustawię FILE_FLAG_OVERLAPPED w CreateFile(...?

0

oldstat to struktura _DCB chodzi o to ze na poczatku pobierasz ustawieni portu a na koncu je przywracasz.

PS. xor nie zauwazylem SetCommMask ! SetCommState
if not SetCommMask(FHPort,EV_ERR) then ... close

i zero moze byc + odwoluje wszystkie zdazenia.

moze na cos jeszcze czeka ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1