上位机使用C#开发,而下位机是C语言开发,ARM MCU。在制定通讯协议时就出现了通讯协议结构体的兼容性问题,记录如下。
1、指定枚举存储类型 占用字节数
1 2 3 4 5 6 7 |
public enum PacketCommand:byte //重点 { Challenge = 0x01, Response = 0x02, Ping = 0x03, Pong = 0x04, } |
2、结构体对齐方式及对齐字节,默认情况下,32位ARM的C语言编译器会以4字节方式对齐,需要使用 #pragma pack(1) 来强制其按1字节对齐
1 2 3 4 5 6 7 8 9 10 11 |
[StructLayout(LayoutKind.Sequential, Pack = 1)] //指定分布方式和对齐字节 public struct CommandPacket { public UInt16 Magic; public PacketCommand Command; public UInt16 Length; //定长数组,预分配内存 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024, ArraySubType = UnmanagedType.U1)] public byte[] Payload; } |