Ada-(Streams)如何在不事先知道字符串长度的情况下正确调用String'Read()

Wos*_*ame 2 string serialization ada stream

我正在尝试编写一个快速程序,以将AT命令发送到串行端口调制解调器。我已经使用正确的设置(B115200、8N1等)打开了端口,下面的代码示例中的String'Write调用实际上可以正常工作。

现在,我要添加代码以将调制解调器的响应读回字符串。但是,我无法事先知道响应的长度,因此out String除非我知道长度,否则无法创建String变量来传递给参数。

  package GSC renames GNAT.Serial_Communications;

  SP : aliased GSC.Serial_Port;

  function Send (Port : in GSC.Serial_Port; S : in String) return String is
  begin
    String'Write (SP'Access, S);
    delay 0.1;

    declare
      Retval : String;  -- NOT VALID - needs to be initialised
    begin
      String'Read (SP'Access, Retval);
      return Retval;
    end;
  end Send;
Run Code Online (Sandbox Code Playgroud)

我这里有鸡肉/鸡蛋的情况。

Sim*_*ght 6

答案可能是一次读取输入的一个字符,直到到达终止符。

您可以分配足够长的缓冲区以容纳尽可能长的响应(例如1024个字节!)(或者可以使用递归-但这会更复杂,并且难以诊断可能的溢出错误)。