Для приложений 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 метод