Я загрузил и установил библиотеку comport. У меня есть симулятор, отправляющий данные через последовательный порт RS232 в программу Selphi. Это следующий фрагмент кода.
procedure TMainForm.ComPortRxChar(Sender: TObject; Count: Integer);
begin
ComPort.ReadStr(CPort.Str, Count);
Memo.Text := Memo.Text + CPort.Str;
end;
Что касается части библиотеки CPort , я добавил:
var
Str: String;
here is the problem.
Пример данных, которые приходят через, примерно как
$HEHDT,288.45,T*1D
$HEHDT,288.46,T*18
$HEHDT,288.47,T*1A
и т. д. Каждая строка отправляется в секунду. Таким образом, с кодом выше, мемо будет отображать все эти данные как есть.
Однако, если я изменю код на:
procedure TMainForm.ComPortRxChar(Sender: TObject; Count: Integer);
begin
ComPort.ReadStr(CPort.Str, Count);
Memo.Text := Memo.Text + CPort.Str + 'haha';
end;
Вот что появится в памятке:
$HEHDT,2haha88.45,T*haha1Dhaha
$HEHDT,2haha88.46,T*haha18haha
$HEHDT,2haha88.47,T*haha1Ahaha
«Ха-ха» появится после 8 символов ASCII. библиотеке, в асинхронной/синхронной части можно использовать не более 8 символов ASCII. присваивается переменной Str?
Как мне изменить коды так, чтобы вся строка данных, независимо от его размер, будет выделен переменной Str вместо всего 8 байт.
ОБНОВЛЕНИЕ** Я понял, что эта часть библиотеки CPort содержит следующий код. может ли кто-нибудь просветить меня о том, как редактировать код? или это правильный блок, который я получил.Благодарность!
// split buffer in packets
procedure TComDataPacket.HandleBuffer;
procedure DiscardPacketToPos(Pos: Integer);
var
Str: string;
begin
FInPacket := True;
if Pos > 1 then
begin
Str := Copy(Buffer, 1, Pos - 1); // some discarded data
Buffer := Copy(Buffer, Pos, Length(Buffer) - Pos + 1);
DoDiscard(Str);
end;
end;
procedure FormPacket(CutSize: Integer);
var
Str: string;
begin
Str := Copy(Buffer, 1, CutSize);
Buffer := Copy(Buffer, CutSize + 1, Length(Buffer) - CutSize);
CheckIncludeStrings(Str);
DoPacket(Str);
end;
procedure StartPacket;
var
Found: Integer;
begin
// check for custom start condition
Found := -1;
DoCustomStart(Buffer, Found);
if Found > 0 then
DiscardPacketToPos(Found);
if Found = -1 then
begin
if Length(FStartString) > 0 then // start string valid
begin
Found := Pos(Upper(FStartString), Upper(Buffer));
if Found > 0 then
DiscardPacketToPos(Found);
end
else
FInPacket := True;
end;
end;
procedure EndPacket;
var
Found, CutSize, Len: Integer;
begin
// check for custom stop condition
Found := -1;
DoCustomStop(Buffer, Found);
if Found > 0 then
begin
// custom stop condition detected
CutSize := Found;
FInPacket := False;
end
else
if Found = -1 then
begin
Len := Length(Buffer);
if (FSize > 0) and (Len >= FSize) then
begin
// size stop condition detected
FInPacket := False;
CutSize := FSize;
end
else
begin
Len := Length(FStartString);
Found := Pos(Upper(FStopString),
Upper(Copy(Buffer, Len + 1, Length(Buffer) - Len)));
if Found > 0 then
begin
// stop string stop condition detected
CutSize := Found + Length(FStopString) + Len - 1;
FInPacket := False;
end;
end;
end;
if not FInPacket then
FormPacket(CutSize); // create packet
end;