Привет ALL! Есть проблема. Написал прогу которая читает данные из СОМ-порта в ассинхронном режиме, установки порта 8n1, выводинфы делаю в Memo. Так вот на выходе должна получаться строка длиной около 140 байт, а на практике получаю 8 байт, потом переход на новую строку в Memo и след. 8 байт из той же строки. Мне интересно как можно сделать чтобы выходная строка была как одна строчка в Memo?
Код | procedure ReadThread.Execute; var ComStat: TComStat; dwMask, dwError, R: DWORD;
begin FRead:=0;
OverRead.hEvent := CreateEvent(nil, True, False, nil); if OverRead.hEvent = Null then raise Exception.Create('Error creating read event'); FreeOnTerminate := True;
while not Terminated do begin if not WaitCommEvent(hPort, dwMask, @OverRead) then begin if GetLastError = ERROR_IO_PENDING then WaitForSingleObject(OverRead.hEvent, INFINITE) else raise Exception.Create('Error waiting port event'); end; if not Terminated then if not ClearCommError(hPort, dwError, @ComStat) then raise Exception.Create('Error clearing port');
R := ComStat.cbInQue; If R>FRead then begin FreeMem(Buffer); Buffer:=AllocMem(R); end; FRead:=R;
If Terminated then Break; if FRead > 0 then begin if not ReadFile(hPort, Buffer^, FRead, FRead, @OverRead) then raise Exception.Create('Error reading port'); Synchronize(DoRead); end; end; end;
procedure ReadThread.DoRead; var arrBytes: array of Byte; i: Integer; TmpStr : string; begin try If Terminated then Exit; begin SetLength(arrBytes, FRead); for i := 0 to FRead - 1 do arrBytes[i] := Buffer^[i]; //возможно Buffer^[i]
TmpStr := ''; for i := Low(arrBytes) to High(arrBytes) do begin if i >= Low(arrBytes) then TmpStr := TmpStr + IntToHex(arrBytes[i], 2); end; fmMain.mmOutput.Lines.Add(HexToStr(TmpStr));
arrBytes:=nil; end; except end; end;
|
|