2010-11-20 75 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”属性,以便所有结构元素都以可预测的方式定位。