2010-11-20 25 views
4

我們公司生產許多嵌入式設備,通過我用C#.net編寫的應用程序與PC進行通信。我一直在考慮改進數據傳輸的不同方法,以便PC應用程序可以更容易地與設備當前狀態(在某些情況下不斷變化)同步。以xml格式輸出來自嵌入式設備的數據是否聰明?

我一直在考慮設備將它的描述和狀態消息格式化爲xml格式的消息,然後再通過串口,USB,以太網接口等發送它們的方法。我想這可能會使進程將所有這些數據放到我的C#類中更簡單。

另一種方法是其中主機應用程序發送的getStatus像一個命令的方法和設備與字節數組響應,每個表示不同的屬性,傳感器讀數等

我沒有很大的使用xml的經驗,但從我看到可以用LINQ to XML完成它似乎可能是一個好主意。你們有什麼感想?這是通常做的事嗎?這是一個可怕的主意嗎?!?

回答

4

首先,您要確保返回的數據具有嵌入的版本號,以便修改數據結構。

既是一個選項?說真的,總有些情況下,以更可讀的形式發送數據是可取的,而其他情況下,更密集的表示法是最好的(這些比大多數人想象的要少,但我不想就此開始宗教戰爭)。人們會熱烈地爭論這兩者,因爲他們正在針對不同的事情進行優化。提供這兩種選擇都可以滿足兩個陣營。

一個不錯的,清晰的XML狀態肯定會降低開始使用設備的人的酒吧。您也可以構建一個可以從返回的二進制數據反序列化的C#對象。

+0

感謝您的洞察 – PICyourBrain 2010-11-20 17:56:55

+1

+1版本 – 2010-11-20 22:51:33

2

這不是一個可怕的想法,但它可能是一個過度設計。我更願意使用嵌入式設備將更容易,更快速地生成的格式。然後在個人電腦端,我會插入一個圖層以將其轉換爲便捷的格式。你也可以使用LINQ和對象。爲什麼不以二進制形式或簡單的ASCII協議發送數據,然後將其轉換爲C#對象?您可以使用LINQ來訪問數據。在我看來,在這種情況下,XML引入了不必要的複雜性。

1

任何一種方式都有權衡,所以正確的選擇取決於您的應用程序,您的設備功能有多強大,以及誰將使用此協議。

您提到替代方法是二進制序列化的請求響應方法。我認爲這裏有兩個單獨的維度:序列化格式(二進制或XML)和通信風格。您可以使用推式協議或請求響應協議中所需的任何序列化格式。如果

  • 可讀性很重要是
  • 如果設備之間變化,即,如果您有多個具有不同的屬性,因爲XML往往是自描述的不同設備

    XML可能是一個不錯的選擇。

  • 或者如果你想發佈你的設備的數據到互聯網。

當然,XML是詳細的,當然有一些方法可以用二進制協議完成上述所有操作(例如,帶標記的值可以用來使您的二進制協議更具描述性)。

0

我做在前面設計的PC使用XML格式的微處理器的通信非常類似的東西了一些理智和有趣的觀點。它在PC端運行得非常好,因爲Adobe Flex(我們正在使用的)可以很容易地解釋XML,我懷疑.Net可以很容易地做同樣的事情。

它更復雜的部分是在微處理器方面。 XML解析必須手動完成,這並不複雜,但只是時間緊張。根據你在做什麼,創建XML字符串也可以是很多代碼。總的來說 - 如果我不得不再次這樣做,我仍然認爲XML是一個不錯的選擇,因爲它是一個非常靈活的協議。關於在微處理器端存儲少量數據包到我們的FIFO緩衝區方面,RAM並不是什麼大問題,但這可能是您的應用需要考慮的問題。

0

這是浪費寶貴的嵌入式CPU時間來生成和傳輸XML文件。相反,我只是使用二進制字節數組表示數據,但我會使用結構來幫助解釋數據。 C#的結構特性使您可以輕鬆地將字節數組解釋爲有意義的數據。這裏有一個例子:

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public struct DeviceStatus 
{ 
    public UInt16 position; // Byte 0 and 1 
    public Byte counter;  // Byte 2 
    public Fruit currentFruit; // Byte 3 
}; 

enum Fruit : Byte 
{ 
    Off = 0, 
    Apple = 1, 
    Orange = 2, 
    Banana = 3, 
} 

那麼你將有你的字節數組轉換到這個結構的函數:

public unsafe DeviceStatus getStatus() 
{ 
    byte[] dataFromDevice = fetchStatusFromDevice(); 
    fixed (byte* pointer = dataFromDevice) 
    { 
     return *(DeviceStatus*)pointer; 
    } 
} 

與XML比較,這種方法將節省CPU時間在設備上,在PC,而且它比XML模式更容易維護,並具有用於構建和解析XML文件的補充功能。您所要做的就是確保嵌入式設備中的struct和enum定義與C#代碼中的定義相同,以便C#程序和設備同意要使用的協議。

您可能想要在C#和嵌入端都使用「packed」屬性,以便所有結構元素都以可預測的方式定位。