收到ciacomport中的角色

时间:2013-08-28 19:17:26

标签: delphi

我在Delphi5中使用CiaComPort,我遇到了问题。我向设备发送命令。我使用Send(Buffer: Pointer; Len: integer): cardinal函数。

procedure TFormMain.CiaComportraParancsotKuld(CNev, Szoveg: WideString; NyoId, PortSzam: Integer);
var
  Kar: PChar;
  Szam: Integer;
  Parancs: WideString;
begin
  Parancs := #$0002+'~JS0|'+CNev+'|0|'+Szoveg+#$0003;
  Kar := PChar(Parancs);
  Szam := length(Parancs)*2;
  FormMain.CiaComPort1.Open := True;
  FormMain.CiaComPort1.Send(Kar, Szam);
  FormMain.CiaComPort1.Open := False;
end;

这个程序很好,但是当我发送命令时,很遗憾我没有看到设备中即将出现的字符,因为在我看来我没有使用CiaComPort1DataAvailable(Sender: TObject)井。

//Receive(Buffer: Pointer; Len: integer): cardinal

procedure TForm1.CiaComPort1DataAvailable(Sender: TObject);
var
  Kar: PChar;
  Szam: Integer;
  Parancs: WideString;
begin
  Szam := RxCount;
  Parancs := WideString(Receive(Kar, Szam)); //I think that's not good.
  Memo1.Lines.Add(Parancs);
end;

不幸的是我无法读取缓冲区。你有什么想法吗?

1 个答案:

答案 0 :(得分:2)

显然,RxCount会告诉您收到的字节数。 Receive函数希望你给它一个缓冲区,然后它将填充该缓冲区,达到你告诉它的大小。在您的代码中,您提供了大小,但是您没有提供缓冲区。您需要为缓冲区分配空间。如果您使用WideString作为缓冲区,则使用SetLength分配空格:

Szam := RxCount;
SetLength(Parancs, Szam div 2);
Receive(PWideChar(Parancs), Szam);

我不知道Receive的返回值是什么意思,所以我在这里没有证明它的用途。我相信如果您查看文档,您可以了解它的用途。