GNAT.Serial_Communications как конвертировать Stream_Element_Array - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь написать небольшую коммуникационную программу с Arduino, используя пакет GNAT.Serial_Communications.

Установление связи с Arduino работает нормально.Я использую функцию Serial_Communications.Read(), чтобы получить информацию.Теперь я хочу преобразовать данные, хранящиеся в Stream_Element_Array, в Integer.

Я попробовал функцию Integer'Value(), но она не работает, и я получаю сообщение об ошибке: expected type "Standard.String"

Использование String'Value() приводит к: prefix of value attribute must be scalar type.

Я не могу найти информацию о конвертации Stream_Element_Array.

  Serial_Communications.Open
  (Port => Port,
   Name => Port_Name);

  Serial_Communications.Set
  (Port      => Port,
   Rate      => Serial_Communications.B115200,
   Bits      => Serial_Communications.CS8,
   Stop_Bits => Serial_Communications.One,
   Parity    => Serial_Communications.Even);


  Serial_Communications.Read(Port  => Port,
                             Buffer => Buffer,
                             Last   => Last);

  Int_value := Integer'Value(String'Value(Buffer(1)));

  Serial_Communications.Close(Port => Port);

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

Тип GNAT.Serial_Communications.Serial_Port является расширением Ada.Streams.Root_Stream_Type:

type Serial_Port is new Ada.Streams.Root_Stream_Type with private;

Это означает, что вы можете использовать его как поток и, следовательно, использовать атрибут Read (см. ARM 13.13 для деталей).Кроме того, я бы рекомендовал использовать целочисленный тип из пакета Interfaces вместо типа Ada Integer, поскольку все целочисленные типы Ada определены минимальным поддерживаемым диапазоном и не имеют обязательного размера хранилища (см. ARM).3.5.4 (21) и ARM B.2 для деталей).

Может помочь следующий пример:

with Interfaces;
with GNAT.Serial_Communications;

procedure Main is

   package SC renames GNAT.Serial_Communications;

   Port_Name :         SC.Port_Name := "COM1";
   Port      : aliased SC.Serial_Port;

   Int_Value : Interfaces.Integer_8;

begin

   SC.Open
     (Port => Port,
      Name => Port_Name);

   SC.Set
     (Port      => Port,
      Rate      => SC.B115200,
      Bits      => SC.CS8,
      Stop_Bits => SC.One,
      Parity    => SC.Even); 

   --  Check Interfaces package for types other than "Integer_8".
   Interfaces.Integer_8'Read (Port'Access, Int_Value);

   SC.Close(Port => Port);

end Main;
1 голос
/ 04 апреля 2019

Из того, что я видел в ARM , Stream_Element является модульным типом и, кстати, уже должно быть приведено к типу Integer .

Что-то вроде

Int_value := Integer(Buffer(Buffer'First));

должно работать напрямую, но я ничего не тестировал;)

...