以xml格式从嵌入式设备输出数据是否智能?

时间:2010-11-20 16:36:37

标签: c# xml linq embedded

我们公司生产许多嵌入式设备,通过我用C#.net编写的应用程序与PC通信。我一直在考虑改进数据传输的不同方法,以便PC应用程序可以更容易地与设备当前状态同步(在某些情况下会不断变化)。

我一直在考虑一种方法,设备将其描述和状态消息格式化为xml格式的消息,然后通过串口,USB,以太网套接字等发送。我当时认为它可能会使将所有这些数据放入我的C#类更简单。

另一种方法是主机应用程序发送命令,如GETSTATUS,设备响应一个字节数组,每个字节代表不同的属性,传感器读数等。

我没有很多关于xml的经验,但从我看到的LINQ to XML可以看出它似乎是一个好主意。你们有什么感想?这是通常做的事情吗?这是一个可怕的想法吗?!?

6 个答案:

答案 0 :(得分:4)

首先,无论如何,请确保返回的数据嵌入了版本号,以便您可以修改数据结构。

这两种选择吗?说真的,总有一种情况是以更易阅读的形式发送数据是最好的,而其他更密集的表示最好的情况(这些比大多数人想的要少,但我不想对它发起宗教战争)。人们会热情地争论两者,因为他们正在针对不同的事情进行优化。提供这两种选择将满足两个阵营。

一个漂亮,清晰的XML状态肯定会降低开始使用您的设备的人的标准。您还可以构建一个C#对象,该对象可以从返回的二进制数据中反序列化。

答案 1 :(得分:2)

这不是一个可怕的想法,但它可能是一个过度设计。我更喜欢使用嵌入式设备生成更简单,更快速的格式。然后在PC端我会插入一个图层以将其转换为方便的格式。您还可以将LINQ与对象一起使用。为什么不以二进制形式或简单的ASCII协议发送数据,然后将其转换为C#对象?您可以使用LINQ来访问数据。在我看来,在这种情况下,XML引入了不必要的复杂性。

答案 2 :(得分:1)

无论哪种方式都有权衡,所以正确的选择取决于您的应用程序,您的设备有多强大以及谁将使用此协议。

您提到备选方案是二进制序列化的请求 - 响应方法。我认为这里有两个不同的维度:序列化格式(二进制或XML)和通信风格。您可以在推送协议或请求 - 响应协议中使用所需的任何序列化格式。

如果

,XML可能是一个不错的选择
  • 可读性很重要
  • 如果设备之间存在差异,即如果您有不同的设备具有不同的属性,则因为XML往往是自我描述的。
  • 或者,如果您要将设备的数据发布到Internet。

当然,XML是冗长的,并且有一些方法可以使用二进制协议来完成上述所有操作(例如,使用标记值可以使您的二进制协议更具描述性)。

答案 3 :(得分:0)

这个网站的创始人之一对XML: The Angle Bracket Tax

中的XML有一些理智和有趣的看法

答案 4 :(得分:0)

我在之前的设计中做了一些与使用XML格式的PC到微处理器通信非常相似的东西。它在PC端非常好用,因为Adobe Flex(我们使用的)可以很容易地解释XML,我怀疑.Net可以很容易地做同样的事情。

更复杂的部分是在微处理器方面。 XML解析必须手动完成,这并不是那么复杂,而只是时间密集。根据你正在做的事情,创建XML字符串也可能是很多代码。

总体而言 - 如果我不得不再次这样做,我仍然认为XML是一个不错的选择,因为它是一个非常灵活的协议。关于在微处理器端的FIFO缓冲区中存储少量数据包,RAM并不是一个很大的问题,但在您的应用程序中可能需要考虑这一点。

答案 5 :(得分:0)

生成和传输XML文件浪费了宝贵的嵌入式CPU时间。相反,我只会使用一个二进制字节数组来表示数据,但我会使用结构来帮助解释数据。 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相比,此方法将节省设备和PC上的CPU时间,并且比XML模式更易于维护,具有用于构建和解析XML文件的补充功能。您所要做的就是确保嵌入式设备中的struct和enum定义与C#代码中的定义相同,以便C#程序和设备就要使用的协议达成一致。

您可能希望在C#和嵌入式端使用“packed”属性,以便所有struct元素都以可预测的方式定位。