Mam problemy z odczytem z portu.
- Jak ustawię przedostatni parametr funkcji CreateFile na FILE_FLAG_OVERLAPPED to czyta mi dwa razy to samo
- 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?