C#程序與單片機通信時,如何實現結構體轉換為二進制流

C#程序與單片機通信時,如何實現結構體轉換為二進制流

通信

在前一篇,《<strong>》中,給大家介紹瞭如何在C#中定義一個與下位機C語言內存分佈一致的結構體。有了這個結構體之後,在數據發送時,必須要把結構體轉換為二進制流。

在C語言裡,實現結構體與二進制流是可以直接轉換的(通過使用C語言和其它語言,我深刻體會到了為什麼C語言一直能長盛不衰,簡單,高效,靈活,機動!不過只限於嵌入式開發了~~)。比如,要發送一個結構體的代碼如下:

參考《<strong>》文中的定義的結構體。

struct Test t;
u8 buffer[50];//存放二進制流
//把結構轉換為二進制流
memcpy(buffer, &t, sizeof(t));
通過通過串口等發送buffer
C#程序與單片機通信時,如何實現結構體轉換為二進制流

C#

在C#裡沒有memcpy,也不能這麼直接進行結構轉換,需要用到Marshal內存管理機制(這部分我們以後再講)。把任意類型數據類型轉換為二進制流的代碼如下,

T通配符,實際使用時替換為實際數據類型。

public Byte[] Type2Bin(T t)
{
//得到類型大小
Int32 Size = Marshal.SizeOf(typeof(T));
Byte[] ret = new byte[Size];
//分配內存
IntPtr ptr = Marshal.AllocHGlobal(Size);
//結構轉換
Marshal.StructureToPtr(t, ptr, true);
//拷貝到返回值
Marshal.Copy(ptr, ret, 0, Size);
//釋放內存
Marshal.FreeHGlobal(ptr);
return ret;
}
Test t;
Byte [] bin;
//結構轉換為字節流
bin = Type2Bin<test>(t);
發送bin的二進制流。
/<test>
C#程序與單片機通信時,如何實現結構體轉換為二進制流

信息收發

想進一步瞭解此話題,請繼續閱讀以下文章:

上一篇,

後兩篇


分享到:


相關文章: