C => C # Есть ли простой способ воспроизвести приведение структуры для двоичного взаимодействия - PullRequest
0 голосов
/ 11 ноября 2018

Для приложений USB и последовательного интерфейса я реализую протокол, а в C / C ++ это можно сделать аккуратно, приведя структуру к буферу, что делает его удобным для кодирования / декодирования данных в байтовый массив, который может затем будет перенаправлен на USB или последовательный порт.

Другой конец связан с микроконтроллером. Преимущество этого состоит в том, что структура и механизм упаковки / распаковки могут быть общим кодом между хост-приложением и приложением микроконтроллера.

Вот пример упаковки данных в буфер символов.

Редактировать: обратите внимание, что структура упакована, что означает, что между типами нет заполнения.

#pragma pack(push,2)
typedef struct 
{
    uint32_t address ;
    uint32_t len;
    uint16_t crc;
} FlashData;
#pragma pack(pop)


unsigned char buf[size + sizeof(FlashData)] __attribute__((aligned));

FlashData *flashData = (FlashData*) &buf[0];
flashData->address = startAddr;
flashData->len = size;
[...]

Есть ли простой способ воспроизвести этот тип приведения в C #?

Много лет назад я осуществлял аналогичное общение в C #, но я помню, что мне приходилось сериализовывать данные, распаковывая их вручную, что было неприятно.

Существует некоторый пример C # копирования структуры данных C # в байтовые массивы, но, поскольку каждый объект и тип наследуются в C #, я не уверен, что это было бы хорошим решением.

Другим способом может быть решение как с C ++, так и с проектом C #, C ++ заботится о низком уровне связи и C # более высоком уровне и управлении пользовательским интерфейсом, связывая через DLL.


EDIT

Ответ на самом деле дал elgonzo на комментарии.

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    private struct Packet
    {
        public byte header;
        public byte cmd;
        public ushort address;
        public ushort len;
        public ushort crc;
    }

и GetByte метод

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Метод BitConverter.GetBytes преобразует базовые типы данных в массив байтов.

0 голосов
/ 11 ноября 2018

Другой конец связан с микроконтроллером. Преимущество этого состоит в том, что структура и механизм упаковки / распаковки могут быть общим кодом между хост-приложением и приложением микроконтроллера.

К сожалению, ваш код будет работать иначе на 64-битном ПК против 32-битного мкК.

Компиляторы могут не согласиться с sizeof(unsigned long), что составляет 4 для большинства архитектур микроконтроллеров и 8 для 64-битных ПК. Некоторые µC также работают с прямым порядком байтов.

Поэтому было бы намного лучше написать правильный код сериализации / десериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...