c语言改变结构体对齐方式(程序与单片机通信时)(1)

通信

在单片机开发过程中,难免要遇到与PC通信的问题。这里有个不可回避的问题就是数据结构的定义,只有数据结构内存分布一致时,才能方便的通信,而不需要进行转换。在C语言里,定义一个数据结构并字节对齐非常简单。如下

__attribute__((packed)) struct Test { u32 a; u8 b; u32 c; u8 arr[5]; } struct Test t; 此结构共14字节, 并且可以直接使用。

如何在C#中实现一个同样的结构体呢?需要用到System.Runtime.InteropServices里的内存管理StructLayout和MarshalAs。并且数据要动态分布内存。

[StructLayout(LayoutKind.Sequential, Pack =1)] struct Test { public UInt32 a; public Byte b; public UInt32 c; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] Byte[] arr; } Test t; //在使用前要给数据分布内存 t.arr = new Byte [5]; 使用t.

这两个和在内存中的分布完全一致,可以在单片机与PC机之间相互通信了。

c语言改变结构体对齐方式(程序与单片机通信时)(2)

通信

c语言改变结构体对齐方式(程序与单片机通信时)(3)

想进一步了解此话题,请继续阅读以下文章:

C#程序与单片机通信时,如何实现结构体转换为字节流

C#程序与单片机通信时,如何自动初始化串口(1)?

C#程序与单片机通信时,如何自动初始化串口(2)?

,