我设计了一个小项目,使用ComPort Library 4.10版从Comport读取。当我使用com0com仿真器测试时它工作得很好但是当我从真机读取数据时(它是通过RS232发送数据的电子测试机)数据来自CR和LF,我已经搜索了很多并尝试了所有程序清除CR& LF但失败了。
这是我的代码;
var veri:string;
begin
panel1.Color:=clGreen;
panel1.Caption:='VERİ OKUNUYOR';
veri:=Trim(Str);
memo1.lines.add(CleanupString(trim(veri)));
我试图删除#13,#13#10,#13 +#10,#32,sLineBreak并尝试以下功能;
function CleanupString(S :string) :string;
var
i :integer;
begin
Result := S;
for i := 1 to Length(Result) do
if Result[i] in [#3..#13] then
Result[i] := '_';
end;
function RemoveCRLF (const aString : string) : string;
var i, j : integer;
begin
result := aString;
j := 0;
for i := 1 to Length (result) do
begin
if (not (result [i] in [#10, #13]))
then begin
inc (j);
result [j] := result [i];
end;
end;
SetLength (result, j);
end;
但到目前为止没有运气,下面的图片显示了我的备忘录内容的样子; 设备发送数据以" APSiS0BE"开头并且似乎向每个参数发送CR& LF但我无法在一行中获取数据。
答案 0 :(得分:2)
我认为你没有看到你相信你所看到的东西。
当你向TMemo添加一行时,你隐式添加一个CR + LF,所以你要删除它们,然后重新添加它们。如果不是,当你在Notepad ++中打开内容时,会有是空的空白行,你没有看到它们。
所以,我认为你成功删除了CR + LF,你只是没有意识到它。
答案 1 :(得分:1)
Delphi具有内置的Trim
方法,将删除前导和尾随空格和控制字符(CRLF等)。您的方法将其从字符串中的任何位置删除,但对于RS-232协议,通常只需要Trim
{1}}。
也就是说,TMemo.lines.Add
方法在备忘录中添加一行...使用CRLF,因此如果您正在检查备忘录输出,它自然会在其中包含行结尾字符。如果没有它,文本将只在一行上继续。
答案 2 :(得分:0)
我也使用ComPort,我使用StringReplace删除CR + LF:
S:= StringReplace(C, sLineBreak, '', [rfReplaceAll]);