Пришлось немного
поскрести по сусекам и привести код к такому виду: пока сбоев не дал
// Асинхронный принцип чтения СОМ-порта
procedure PortInit(COM: String);
var ThreadID: DWORD;
begin
KolByte:=0;
//Создание и иницализация порта
CommHandle := CreateFile(PChar(COM), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
//Устанавливаем DCB
GetCommState(CommHandle,DCB);
DCB.BaudRate:=CBR_56000;
DCB.Parity:=NOPARITY;
DCB.ByteSize:=8;
DCB.StopBits:=OneStopBit;
SetCommState(CommHandle,DCB);
// Сброс порта
PurgeComm(CommHandle,PURGE_TXCLEAR or PURGE_RXCLEAR);
//Ставим маску
SetCommMask(CommHandle,EV_RXCHAR);
//Создаем паралельный поток, там будет вертеться процедура приема строки с порта - ReadComm
CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);
end;
Procedure ReadComm;
var
mybyte:string;
i:integer;
Resive:array [0..255] of byte;
Shex, Shexc: string;
begin
Shex:='';
while true do
begin
TransMask:=0;
WaitCommEvent(CommHandle,TransMask,@Ovr);
if (TransMask and EV_RXCHAR)=EV_RXCHAR then
begin
// Узнаем сколько байт данных находится в буфере передачи последовательного порта
ClearCommError(CommHandle,Errs,@Stat);
Kols := Stat.cbInQue;
ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);
For i := 0 To 129 do
If StrToInt(Resive[i]) <= 15 Then
Shex := Shex + '0' + Format('%0x',[StrToInt(Resive[i])]) + ' '
Else
Shex := Shex + Format('%0x',[StrToInt(Resive[i])]) + ' ';
For i := 1 to Length(Shex) do
If Shex[i] <> ' ' Then Shexc := Shexc + Shex[i];
Sleep(10000);
end;
end;
end;