forum.jpg
通信
在单片机开发过程中,难免要遇到与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。并且数据要动态分布内存。
    <span style="background-color: rgb(255, 255, 255); font-family: Arial; font-size: 14.6667px;">[</span>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];
  • 复制代码

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