gpt4 book ai didi

string - 字符串串联不起作用

转载 作者:行者123 更新时间:2023-12-03 18:35:48 25 4
gpt4 key购买 nike

我创建了一个简单的类来存储从串行端口接收的数据,并在某些条件下将其拆分。我意识到它无法正常工作,因此我逐步对其进行了编码,以查看出了什么问题。我发现这是一个字符串连接。这是该类的代码。失败的行是buffer = buffer + tail;

unit InBuffer;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils;

type
TInBuffer = class
private
buffer: String;
messages: TStrings;
public
constructor Create;
destructor Destroy;
procedure Add(tail: string);
function getBuffer: String;
function getLast: String;
function DataAvailable: boolean;
end;

implementation

constructor TInBuffer.Create;
begin
buffer := '';
messages := TStringList.Create;
end;

destructor TInBuffer.Destroy;
begin
messages.Free;
inherited Destroy;
end;

procedure TInBuffer.Add(tail: string);
begin
buffer := buffer + tail;
end;

function TInBuffer.GetBuffer: String;
begin
Result := buffer;
end;

function TInBuffer.GetLast: String;
begin
if DataAvailable then
begin
Result := messages[0];
messages.Delete(0);
end;
end;

function TInBuffer.DataAvailable: boolean;
begin
Result := messages.Count > 0;
end;

end.


我使用 SdpoSerial进行通讯。在OnRxData事件中,我有此代码。

procedure TfrmMain.serOnRxData(Sender: TObject);
var
msg: string;
begin
msg := ser.ReadData;
buff.Add(msg);
log('Stored buffer: ' + buff.getBuffer);
log('Receive trace: ' + msg);
end;


在日志中,我在“接收跟踪”中看到了正确的数据,但是“存储的缓冲区”中的行始终是相同的(通信中收到的第一条消息)。我尝试使用 CopyConcat之类的函数来构建缓冲区,但是没有任何变化。

我可能做错了什么?

谢谢。

编辑:
按照Abelisto的建议,我将这段代码放在了按钮的onClick事件中

buff.Add('111');
buff.Add('222');
ShowMessage(buff.getBuffer);


并且显示的消息是正确的。因此,传递来自串行端口的数据存在一些问题。它正确显示在日志中,但未正确显示在缓冲区中。有什么想法吗?

最佳答案

尽管诸如RS232之类的外部设备可以将任何必需的东西发布到端口上。在我们的情况下,设备发布NULL字符,该字符在C编写的OS中破坏了字符串。 Pascal字符串可以处理它,但OS wigets无法处理。但是我对控制台之类的应用程序感到困惑,因为它可以很好地处理NULL字符。所以要小心

关于string - 字符串串联不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32170427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com