var
  sMsg,Str: string;
begin
  sleep(100);
  Str:='';
  SetLength(sMsg,BufferLength);
  move(buffer^,pchar(@sMsg[1])^,bufferlength);
  Memo1.Text := Memo1.Text + sMsg;  //显示接收数据没问题
  ...
end
改成:
begin
  sleep(100);
  Str:='';
  SetLength(sMsg,BufferLength);
  move(buffer^,pchar(@sMsg[1])^,bufferlength);
  Str:= Str + sMsg;
  Memo1.Text := Str;  //显示接收数据不全,不知为什么?
  ...
end

解决方案 »

  1.   

    str改为全局变量就行,或者和Memo1在一个Scope中
      

  2.   

    调试一下,看看你接收到的长度 与 bufferlength是否一至。如果不对,很有可能是控件问题。用Tcomport好此。
    我开始也用spcomm,总是有些问题。
      

  3.   

    看上去str变量作用域的问题pchar(@sMsg[1])^
    这个不得不吐槽一下,直接就可以
      

  4.   

    楼主这么简单的逻辑都看不出来,每次接收数据时 Str 都被清空了,导致只显示最后一次接收的数据。
      

  5.   

    Delphi 是啥版本的?有可能是版本的问题 早期的D是 String是单字节的,而且现在是双字节的。
    Spcomm此控件如果是早期版本的话,装了Unicode版本上,会出现问题。
    建议使用Cnpack中的VCL控件包,一直在维护和更新的。不用担心版本 或 更新的问题。Cnpack官网上就有此控件包。