Foksiyon şu şekilde...
Kod: Tümünü seç
Function WriteComPort(var Buffer:TMyByteArray;BufLen,ByteToRead, TimeOut:Integer; SleepTime:Integer=100; RdTill:String=''):Integer;
var
tmpstr :String;
ByteWr,ByteRd:Cardinal;
Res,CanRead:Boolean;
Retval:Cardinal;
DwErr:DWORD;
i,EofLen:Integer;
EofBuf,aBuf:TMyByteArray;
OvrIn : TOverlapped;
OvrOut : TOverlapped;
begin
Result:=-1;
PurgeAll();
if BufLen > 0 then begin
FillChar(OvrOut,SizeOf(OvrOut),0);
OvrOut.hEvent:=CreateEvent(nil,True,False,'WrTest');
OvrOut.Internal:=0;
OvrOut.InternalHigh:=0;
OvrOut.Offset:=0;
OvrOut.OffsetHigh:=0;
if not WriteFile(hComHandle,Buffer[0],BufLen,ByteWr,@OvrOut) then begin;
if GetLastError = ERROR_IO_PENDING then begin
if WaitForSingleObject(OvrOut.hEvent,TimeOut)=WAIT_OBJECT_0 then begin
result:=0;
Application.ProcessMessages;
end
else begin
CancelIO(hComHandle);
ResetEvent(OvrOut.hEvent);
CloseHandle(OvrOut.hEvent);
exit;
end;
CloseHandle(OvrOut.hEvent);
end
else begin
Result:=0;
end;
end
else begin
result:=0;
end;
end;
//Finish Write Section - Process to Read Section
Delay2(SleepTime);
Application.ProcessMessages;
ByteRd:=0;
FillChar(OvrIn,SizeOf(OvrIn),0);
OvrIn.hEvent:=CreateEvent(nil,True,False,nil);
OvrIn.Internal:=0;
OvrIn.InternalHigh:=0;
OvrIn.Offset:=0;
OvrIn.OffsetHigh:=0;
evMask:=EV_RXCHAR or EV_ERR or EV_BREAK;
//evMask:=EV_RXFLAG or EV_ERR or EV_RXCHAR;
CanRead:=False;
Res:=WaitCommEvent(hComHandle,evMask,@OvrIn);
if Res=False then begin //WaitCommEvent not exited only Freed
RetVal:=GetLastError();
if RetVal=ERROR_IO_PENDING then begin // If WaitCommEvent = IO Pending
RetVal:=WaitForSingleObject(OvrIn.hEvent,Timeout); //Wait For it Finish/Timeout
if RetVal=WAIT_OBJECT_0 then begin
if evMask=EV_RXCHAR then CanRead:=True else CanRead:=False;
end;
end;
end
else begin
if evMask=EV_RXCHAR then CanRead:=True else CanRead:=False;
end;
CloseHandle(OvrIn.hEvent);
Delay2(10);
SetLength(Buffer,0);
if CanRead=True then begin
SetLength(aBuf,ByteToRead);
ZeroMemory(aBuf,ByteToRead);
FillChar(OvrIn,SizeOf(OvrIn),0);
OvrIn.hEvent:=CreateEvent(nil,True,False,nil);
OvrIn.Internal:=0;
OvrIn.InternalHigh:=0;
OvrIn.Offset:=0;
OvrIn.OffsetHigh:=0;
Res:=ReadFile(hComHandle,aBuf[0],ByteToRead,ByteRd,@OvrIn);
if Res=False then begin
RetVal:=GetLastError;
if RetVal=ERROR_IO_PENDING then begin
RetVal:=WaitForSingleObject(OvrIn.hEvent,Timeout);
if RetVal=WAIT_OBJECT_0 then begin
GetOverlappedResult(hComHandle,OvrIn,ByteRd,False);
SetLength(Buffer,ByteRd);
ZeroMemory(Buffer,ByteRd);
CopyMemory(@Buffer[0],@aBuf[0],ByteRd);
Result:=ByteRd;
dwErr:=0;
FillChar(iComStat,SizeOf(iComStat),0);
ClearCommError(hComHandle,dwErr,@iComStat);
if iComStat.cbInQue > 0 then begin
ByteToRead:=iComStat.cbInQue;
SetLength(aBuf,ByteToRead);
ZeroMemory(aBuf,ByteToRead);
ReadFile(hComHandle,aBuf[0],ByteToRead,ByteRd,@OvrIn);
if ByteRd > 0 then begin
SetLength(Buffer,Result+ByteRd);
CopyMemory(@Buffer[Result],@aBuf[0],ByteRd);
Result:=Result+ByteRd;
end;
end;
end
else begin
FillChar(iComStat,SizeOf(iComStat),0);
dwErr:=0;
ClearCommError(hComHandle,dwErr,@iComStat);
if iComStat.cbInQue > 0 then begin
ByteToRead:=iComStat.cbInQue;
CloseHandle(OvrIn.hEvent);
OvrIn.hEvent:=CreateEvent(nil,True,False,nil);
FillChar(OvrIn,SizeOf(OvrIn),0);
OvrIn.Internal:=0;
OvrIn.InternalHigh:=0;
OvrIn.Offset:=0;
OvrIn.OffsetHigh:=0;
SetLength(aBuf,ByteToRead);
ZeroMemory(aBuf,ByteToRead);
ReadFile(hComHandle,aBuf[0],ByteToRead,ByteRd,@OvrIn);
if ByteRd > 0 then begin
SetLength(Buffer,ByteRd);
ZeroMemory(Buffer,ByteRd);
CopyMemory(@Buffer[0],@aBuf[0],ByteRd);
end;
end;
end;
end;
end
else begin
SetLength(Buffer,ByteRd);
ZeroMemory(Buffer,ByteRd);
CopyMemory(@Buffer[0],@aBuf[0],ByteRd);
SetLength(aBuf,0);
Result:=ByteRd;
delay(10);
FillChar(iComStat,SizeOf(iComStat),0);
ClearCommError(hComHandle,dwErr,@iComStat);
if iComStat.cbInQue > 0 then begin
ByteToRead:=iComStat.cbInQue;
SetLength(aBuf,ByteToRead);
ZeroMemory(aBuf,ByteToRead);
ReadFile(hComHandle,aBuf[0],ByteToRead,ByteRd,@OvrIn);
if ByteRd > 0 then begin
SetLength(Buffer,Result+ByteRd);
CopyMemory(@Buffer[Result],@aBuf[0],ByteRd);
Result:=Result+ByteRd;
end;
end;
end;
end;
if Length(RdTill) > 0 then begin
SetLength(EofBuf,0);
EofBuf:=StrtoByteArray(RdTill);
EofLen:=Length(RdTill);
Res:=False;
for i:=0 to EofLen-1 do begin
if (Buffer[(Result-EofLen)+i]=EofBuf[i]) then Res:=True else Res:=False;
end;
if Res=False then begin
FillChar(iComStat,SizeOf(iComStat),0);
ClearCommError(hComHandle,dwErr,@iComStat);
if iComStat.cbInQue>0 then begin
ByteToRead:=iComStat.cbInQue;
OvrIn.hEvent:=CreateEvent(nil,True,False,nil);
FillChar(OvrIn,SizeOf(OvrIn),0);
OvrIn.Internal:=0;
OvrIn.InternalHigh:=0;
OvrIn.Offset:=0;
OvrIn.OffsetHigh:=0;
SetLength(aBuf,ByteToRead);
ZeroMemory(aBuf,ByteToRead);
ReadFile(hComHandle,aBuf[0],ByteToRead,ByteRd,@OvrIn);
if ByteRd > 0 then begin
SetLength(Buffer,Result+ByteRd);
CopyMemory(@Buffer[Result],@aBuf[0],ByteRd);
Result:=Result+ByteRd;
end;
end;
end;
end;
SetLength(aBuf,0);
try
CloseHandle(OvrIn.hEvent);
CloseHandle(OvrOut.hEvent);
except
application.ProcessMessages;
end;
end;