procedure DataCommThread.Execute;
var
counter,PacketCount,fPos,fSize,ReadRes:integer;
CheckSum,Temp:byte;
BufferToFile,BufferFromFile:array[0..31] of byte;
begin
{ Place thread code here }
hCOMPort:=Windows.CreateFile(PChar(COMPortName),GENERIC_READ or GENERIC_WRITE,0,NIL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if GetCommState(hCOMPort,DCB)then begin
///////////////////////////////////////////////////////
DCB.BaudRate:=CBR_115200;
DCB.Parity:=NOPARITY;
DCB.ByteSize:=8;
DCB.StopBits:=ONESTOPBIT;
TimeOuts.ReadIntervalTimeout:=0;
TimeOuts.ReadTotalTimeoutMultiplier:=0;
TimeOuts.ReadTotalTimeoutConstant:=0;
TimeOuts.WriteTotalTimeoutMultiplier:=0;
TimeOuts.WriteTotalTimeoutConstant:=0;
SetCommState(hCOMPort,DCB);
PurgeComm(hCOMPort,purge_txclear or purge_rxclear);
EscapeCommFunction(hCOMPort,SETDTR);
/////////////////////////////////////////
while not CloseCOMPort do begin
////////////////////////
if OutFileName<>'' then begin
FillChar(BufferFromFile,32,0);
BlockRead(outFile,BufferFromFile,32,ReadRes);
FillChar(OutBuffer,38,0);
if ReadRes>0 then begin
for counter:=0 to ReadRes-1 do begin
OutBuffer[counter+3]:= BufferFromFile[counter];
end;
OutBuffer[2]:=ReadRes+3;
OutBuffer[1]:=2;
end
else begin
OutBuffer[1]:=4;
CloseFile(outFile);
end;
end;
////////////////////////
if SentFileName<>'' then begin
OutFileName:=SentFileName;
AssignFile(outFile,FullOutFileName);
Reset(outFile,1);
SentFileName:=''
end;
////////////////////////
OutBuffer[0]:=$7E;
OutBuffer[37]:=$7E;
//////////////////////
OutBuffer[36]:=0;
for counter:=1 to 35 do begin
OutBuffer[36]:=byte(OutBuffer[36]+OutBuffer[counter]);
end;
////////////////////////////////////////////////////
EscapeCommFunction(hCOMPort,SETRTS);
Windows.WriteFile(hCOMPort,OutBuffer,38,Count,@Ovr);
Sleep(200);
////////////////////////
EscapeCommFunction(hCOMPort,CLRRTS);
Stat:=@TStat;
Sleep(200);
ClearCommError(hCOMPort,ComError,Stat);
if Stat.cbInQue=38 then begin
Windows.ReadFile(hCOMPort,InBuffer,38,readBytes,@Ovr);
if (InBuffer[0]=$7E)and(InBuffer[37]=$7E) then begin
CheckSum:=0;
for counter:=1 to 35 do begin
CheckSum:=byte(CheckSum+InBuffer[counter]);
end;
if CheckSum = InBuffer[36] then begin
//////////////////
case InBuffer[1] of
1:
begin
for counter:=4 to InBuffer[2]do begin
InFileName:=InFileName+Char(InBuffer[counter]);
end;
ReadNextPacket:=True;
FullInFileName:=ExtractFilePath(Application.ExeName)+InFileName;
AssignFile(inFile,FullInFileName);
Rewrite(inFile,1);
end;
2:
begin
FillChar(BufferToFile,32,0);
for counter:=3 to inBuffer[2] do begin
BufferToFile[counter-3]:=InBuffer[counter];
end;
BlockWrite(inFile,BufferToFile,InBuffer[2]-3);
end;
3:
begin
end;
4:
begin
InFileName:='';
CloseFile(inFile);
end;
end;
//////////////////
if (OutBuffer[1]=1)or(OutBuffer[1]=2) then begin
ReadNextPacket:=True;
end;
OutBuffer[35]:=1;
end
else begin
OutBuffer[35]:=0;
end;
end;
end;
end;
/////////////////////////////////////////
end;
CloseHandle(hCOMPort);
end;
Вспомогательный поток
Доброго времени суток! Возникла такая проблема-вспомогательный поток в приложении иногда прекращает работу при этом не генерируется никаких исключений, флаг для выхода из потока точно не выставляется. В чем может быть проблема?
Помести код метода в блок try..except..end и посмотри какое исключение генерируется.
Код:
Windows.WriteFile(hCOMPort,OutBuffer,38,Count,@Ovr);
В главной форме
Цитата: Waldgeist
В главной форме
В таком случае зачем порт открываешь в блокирующем режиме???