Преобразование экземпляра класса в необработанный байтовый массив в C# - PullRequest
0 голосов
/ 13 февраля 2020

Я создаю приложение человеко-машинного интерфейса в C#, где необходимо установить связь через последовательный порт между приложением и контроллером робота на основе STM32. Но так как этот контроллер основан на C ++, мне нужно преобразовать коммуникационные объекты в байтовые массивы и затем отправить их. Я пробовал сериализацию классов, но не работает, потому что она генерирует массив данных большего размера (445 байт), а позиции переменных не совпадают, поэтому код на С ++ не может его правильно проанализировать.

Вот мой класс, который нужно отправить роботу:

    [Serializable]
    public class RobotData
    {
        public RobotData(Byte _axisCount)
        {
            axisCount = _axisCount;
            axData = new AxisData[axisCount];

            for (int i = 0; i < axisCount; i++)
            {
                axData[i] = new AxisData((Byte)i);
            }

        }

        public Int16 messageType;
        public Byte axisCount;
        public Int32 statusDWord;
        public AxisData[] axData;

    }

А вот определение внутреннего класса:

    public class AxisData
    {
        public AxisData(Byte _axisId)
        {
            axisId = _axisId;
        }

        public Byte axisId;
        public Int32 position;
        public float velocity ;
        public float acceleration;
        public float torque;

    }

Итак, я пытаюсь создать байтовый массив, где он будет go вот так:

- позиция / переменная

  • 0 / messageType
  • 2 / axisCount
  • 3 / statusDWord
  • 7 / axData [0] .axisId
  • 8 / axData [0] .position
  • ...
  • 54 / axData [2]. момент

(общий размер 58 байт)

Существует ли какой-либо универсальный способ (работающий с любым классом), который создает этот массив чистых необработанных данных? И как могут быть входящие байты данных построены в подобный класс? Спасибо.

1 Ответ

0 голосов
/ 14 февраля 2020

Вы могли бы заняться другими модными вещами, хотя почему бы просто не контролировать сериализацию самостоятельно с BinaryWriter.Write перегрузками.

public class RobotData
{
   ...

   public byte[] ToArray()
   {
      using (var ms = new MemoryStream())
         using (var sw = new BinaryWriter(ms))
         {
            sw.Write(messageType);
            sw.Write(axisCount);
            sw.Write(statusDWord);

            foreach (var data in axData)
            {
               sw.Write(data.axisId);
               sw.Write(data.position);
               ...
            }

            return ms.ToArray();
         }
   }
}
...