![06b947e133d1389db18e043862558cc2.gif](https://i-blog.csdnimg.cn/blog_migrate/ed6bb042d02545530fcfcbfd667cc8b6.gif)
通信
在单片机开发过程中,难免要遇到与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机之间相互通信了。
![1a46c1511f745c6495b22ee62b32228f.gif](https://i-blog.csdnimg.cn/blog_migrate/8241912ff3efe15c65f23dc03722724e.gif)
通信
![0d9568822f08627639c81f6c38b645e0.png](https://i-blog.csdnimg.cn/blog_migrate/c53a8ebd6e6e3171f3a8e4dd7f51c091.jpeg)
想进一步了解此话题,请继续阅读以下文章:
C#程序与单片机通信时,如何实现结构体转换为字节流
C#程序与单片机通信时,如何自动初始化串口(1)?
C#程序与单片机通信时,如何自动初始化串口(2)?